拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Linux vi编辑器完整实战指南:从入门到高效使用

Linux vi编辑器完整实战指南:从入门到高效使用

很多人第一次真正使用Linux,不是在图形界面里点点鼠标,而是通过SSH登录一台远在机房的服务器,眼前只有一个黑乎乎的终端。这时候要改一个配置文件,没有鼠标、没有图形编辑器,你手头最可靠的工具就是vi。我第一次用vi的时候心里全是问号:怎么输入字母不显示字、按退格键反而冒出奇怪字符、想退出还退不出去,网上搜了一圈都说按Esc然后输入:wq,但我怎么操作都不对,最后只好直接把终端关掉重连。后来被工作环境逼着连续用了几周,才慢慢摸到它的脾气。

这篇就把vi编辑器的完整使用经验梳理一遍,覆盖三种模式、常用快捷键、查找替换、配置文件定制和实战中容易踩的坑,适合完全没接触过vi的初学者,也适合已经会基本操作但想系统查缺补漏的人。文章尽量把每个命令的"为什么"也讲清楚,而不是单纯丢一张快捷键表。毕竟vi的命令太多了,只有理解了它的设计逻辑,才能真正记住,而不是背两天就忘。

1. 为什么到了现在还要学vi:三个绕不开的现实场景

1.1 场景一:没有图形界面的服务器环境

很多人是在自己的电脑上装了一个带桌面的Linux发行版,比如Ubuntu桌面版、Deepin或者Kali的默认桌面,平时用鼠标点编辑器改文件,完全没觉得vi有什么必要。但真实的服务器环境,尤其是云服务器、虚拟机里的最小化安装系统,基本都不装图形界面。你通过SSH登录过去,整个屏幕就一个终端,这时候想改Nginx配置、调一下crontab、写一个启动脚本,能用的程序名字就那么几个,vi是其中最通用的一个。

换个角度说,哪怕你只是临时登上一台陌生的机器,不确认它装没装nano、gedit、VSCode,但只要它是Linux,输入vi基本都能打开。这种"保底可用"的属性,让vi成了系统管理员工具箱里最不起眼但最离不开的东西。

1.2 场景二:所有发行版默认都带,不需要额外安装

在联网环境下安装vim其实很快,一条命令就行:

# Debian / Ubuntu sudo apt install vim -y # CentOS / RHEL / Rocky sudo yum install vim-enhanced -y

但问题在于,很多内网服务器、生产环境根本没有外网权限,装一个软件要审批、要拷包、要解决依赖,非常麻烦。而vi几乎是100%预装的,打开就能干活。我遇到过一次客户的内网机器,连wget都没有,更别说包管理器配置了,最后就是靠vi改了将近十个配置文件,一个字符一个字符敲出来的。所以vi不是"要不要学"的问题,而是"你在Linux环境里混,迟早要面对它"的问题。

1.3 vi和vim的关系:先搞清楚再学不迷糊

严格来说,vi是最早的经典编辑器,vim(Vi IMproved)是vi的增强版,增加了语法高亮、多级撤销、可视模式、插件支持等能力。现在大多数发行版里,vi命令其实是vim的软链接或别名,你执行vi打开的就是vim。这没什么不好,因为vim完全兼容vi的基本操作,学vi的快捷键体系,到vim里一样能用。

但你在网上查资料时,会看到很多教程讲"vimrc"而不是"vircc",原因就在这里。下一章要讲的配置部分,也是改~/.vimrc,而不是某个叫~/.virc的文件。记住这个关系,后面找资料就不会被绕晕。

2. 三种模式是怎么回事:vi的整个使用逻辑都建立在这个基础上

2.1 命令模式、插入模式、末行模式分别干什么

vi和Windows上的记事本最大的区别就是:它不是一个"打开就能打字"的编辑器,而是分模式的。理解不了模式,就理解不了vi的一切行为。三种模式分别是:

  • 命令模式(Normal mode):打开vi后默认进入的模式。这个模式下,你敲下的每个字母都被当作命令解释,而不是往文件里输入字符。比如按dd删除当前行,按yy复制当前行。
  • 插入模式(Insert mode):真正往文件里输入文字的模式。和记事本的感觉一样,但你需要先按某个键从命令模式切进来。
  • 末行模式(Last line mode / 命令行模式):在命令模式基础上按一下冒号:进入,vi底部会出现一个输入行,用来执行保存、退出、查找替换等命令,比如:wq保存退出、%s/old/new/g做全局替换。

三种模式的切换关系,可以简单看成:

命令模式 --(按 i / a / o 等)--> 插入模式 命令模式 --(按 : )--> 末行模式 插入模式 / 末行模式 --(按 Esc)--> 命令模式

新手最容易犯的错,就是打开vi后直接敲键盘输入文字,结果屏幕上什么反应都没有,或者出现一堆莫名其妙的命令效果,比如按了d以后光标的字符没了。这不是vi坏了,而是你根本不在插入模式里。

2.2 模式切换口诀和实操演示

切换模式有个简单的记忆口诀:按Esc回人间,按i进输入。

实际操作一下。假设你执行vi test.txt打开了一个空文件,这时候vi处于命令模式,屏幕左下角没有-- INSERT --字样。你想输入"hello",必须先按小写字母i,屏幕左下角出现-- INSERT --,此时键盘才解锁,可以正常打字。输入完成后,按Esc退出插入模式,左下角的-- INSERT --消失,vi回到命令模式,此时你输入的字符保留在文件里,但任何按键都不会继续添加文字了。

2.3 为什么按键盘没反应或乱输字符:模式没搞清的表现

我见过很多新手在命令模式下狂按键盘,屏幕上的代码突然少了一行又一行,就是因为按到的dd、x这些键触发了删除命令。反过来,有些人想退出vi,按了一堆q、w,结果屏幕毫无反应,因为命令模式下单个字母q并不是退出命令,q被解释成了宏录制的开始,直到下一次再按q才结束。真正退出需要按:q,也就是先按冒号进入末行模式,再按q。

还有更经典的场景:已经处于插入模式,却不确定自己到底在哪个模式,于是又按了一遍i。结果屏幕上莫名其妙多了一个字母"i"。因为插入模式下所有键盘输入都原样写进文件了。这时候不要慌,按Esc回到命令模式,再按dd把多余的那行删掉就行。

2.4 新手最容易犯的五个操作错误

结合我带过的经验,这里集中列出几个高频翻车点:

  1. 打开vi就打字,结果命令模式触发各种快捷键,文件被改得乱七八糟。
  2. 按了i进入插入模式,但输入法是中文,敲的标点符号全变成中文全角,写配置文件时把冒号写成了中文冒号,程序直接报错。
  3. 想退出时直接按q,没加冒号,vi毫无反应。
  4. 按Esc后立刻输入:wq,但冒号是按了Shift+中文冒号键然后切回英文模式输入的,导致输入的内容是中文冒号,vi不认。
  5. 在插入模式下按方向键,光标没移动反而输入了ABCD。这个问题放到最后的排查部分细讲。

其实这几个错误都可以靠一件事解决:时刻关注vi屏幕左下角有没有-- INSERT --提示。有,就说明你是输入状态;没有,说明你处于命令状态,键盘上所有键都是控制键。

3. 快捷键体系:从光标移动到批量操作一次讲透

3.1 光标移动:hjkl之外还有很多高效玩法

vi最反直觉的一点是它用h j k l四个键代替方向键,分别是左、下、上、右。这个设计是为了让手指不用离开键盘中央区域,提高输入效率。虽然初学时很别扭,但养成习惯之后,你会发现比伸手去够方向键快得多。

更常用的移动命令是下面这些组合:

快捷键功能说明典型使用场景
h/j/k/l光标左/下/上/右移动一个字符精确定位到某个字符
w跳到下一个单词的开头快速跳过一段英文配置内容
b回到上一个单词的开头回看刚才读过的内容
e跳到当前单词的结尾修改一个单词时快速到词尾
0跳到当前行的行首(第0列)回到行首检查缩进
^跳到当前行第一个非空字符跳到行首但有缩进时更常用
$跳到当前行的行尾快速到行尾追加内容
gg跳到文件第一行查看文件开头
G跳到文件最后一行查看文件末尾
NG跳到第N行,如50G跳到第50行按行号定位到报错行
Ctrl+d向下翻半屏阅读日志文件
Ctrl+u向上翻半屏回到上一屏内容
Ctrl+f向下翻一整屏快速浏览大文件
Ctrl+b向上翻一整屏往回翻页

这里说一个我自己的使用习惯:读代码的时候,w和b用的频率远高于h和l。因为代码里缩进很多,按h一格一格挪太慢,按w按单词跳效率高得多。移动的目的是让光标到达你想编辑的位置,而不是为了按而按。

3.2 插入、删除、复制、粘贴的快捷组合

编辑命令是vi快捷键里最核心的部分。先按住Esc回到命令模式,再用下面的组合:

快捷键功能说明使用场景
i在光标前插入最常用的插入方式
I在当前行行首插入快速到行首添加内容
a在光标后插入想在某个字符后面追加时
A在当前行行尾插入不用先按$再按i
o在下一行插入新行往下添加配置项时最快
O在上一行插入新行往上方加内容时最快
x删除光标下的字符单字符删除
X删除光标前的字符类似退格键
dd删除当前整行删掉一行配置
dw删除从光标到单词结尾删除一个单词的一部分
d$删除从光标到行尾清空当前行的后半部分
d0删除从行首到光标位置清空当前行的前半部分
yy复制当前整行复制配置行
yw复制光标所在单词复制一个单词
p粘贴到光标之后粘贴已复制或删除的内容
P粘贴到光标之前在当前位置前粘贴
D相当于d$删除到行尾

删除和复制在vi里是联动的,dd删除的内容会保存在寄存器里,相当于"剪切",用p就可以粘贴到别处。所以很多人习惯用dd加p实现"把这一行移下去"的效果:先dd删掉,再移动到目标位置按p。

3.3 撤销、重做与重复命令

vi里撤销操作的默认快捷键是u,在命令模式下按u撤销上一步。这个"上一步"的定义比记事本更细,比如你连续输入了二十个字符,在记文本里算一步,在vi里可能算很多步,因为每一个插入动作的撤销粒度可以拆得很细。经验是,突然改错了一段,多按几次u一般能回到你想要的状态。

撤销之后想反悔,也就是重做,快捷键是Ctrl+r。举例:你按u撤销了某次删除,接着又按了一次u,想取消撤销,就可以按Ctrl+r恢复。这两个键配合起来,基本能覆盖误操作的回退需求。

还有一个很实用的命令是.,也就是英文句号。它会重复上一次的编辑操作。比如你刚做了一次"删除当前行"的操作,那么每按一次.就删除下一行,很适合批量处理格式统一的内容。又比如你刚粘贴了一次配置,移动光标到另一处再按.,等于又粘贴一次,省去反复p的麻烦。

3.4 数字前缀:让快捷键按倍数生效

vi里绝大多数命令都可以在前面加数字,表示执行次数。这个设计看着简单,实际用起来效率提升非常明显:

  • 5dd:删除从当前行开始的5行。
  • 3yy:复制当前行及下面两行,共3行。
  • 2w:往后跳两个单词。
  • 10x:删除从光标位置开始的10个字符。
  • 3p:粘贴3次。

我第一次用5dd删日志文件里的连续错误行时,明显感觉比一行一行删快太多了。后来养成了习惯,凡是涉及"连续、重复"的操作,都会先想想能不能加个数字前缀。

还有一个小技巧:当你不确定当前文件有多少行时,先输入一个很大的数字,比如99999G,vi会自动跳到文件最后一行,效果和G一样。反过来,可以用:set nu显示行号,再用:N精确跳转,这两种方式在查报错时很常用。

4. 查找与替换:处理配置文件内容的高频操作

4.1 在vi里搜索关键字

在vi里搜索单词,不是用Ctrl+f,而是在命令模式下按斜杠/,然后输入要搜的内容,回车。vi会从光标当前位置向后查找。比如:

/nginx

回车后,文件中第一个出现"nginx"的位置会被高亮。如果这不是你要找的那一个,按n继续向后查找下一个,按N向前查找上一个。查找时注意区分大小写,默认是区分大小写的。想忽略大小写,可以执行:

:set ignorecase

关闭这个行为用:set noignorecase。

我以前排查Nginx配置时,经常在几百行的配置文件里找某个server_name出现的位置,用/server_name加上连续按n,几秒钟就能遍历所有出现点,比肉眼逐行扫快非常多。

同样,按问号?可以从当前位置向前(也就是往上)查找:

?error

这里的向上、向下是以文本流方向说的,具体用哪个取决于你当前光标位置和目标的相对方位。

4.2 全局替换和局部替换的写法

替换功能是vi里最强大的功能之一,但语法需要稍微记一下。基本格式是:

:s/旧内容/新内容/

举个例子,把当前行的第一个"apple"换成"orange":

:s/apple/orange/

如果想把当前行所有的"apple"都换成"orange",在后面加一个g:

:s/apple/orange/g

如果想针对整个文件替换,前面要加一个%:

:%s/apple/orange/g

这个命令的意思是:百分号代表全文范围,s是替换substitute,g是global全局替换。如果你看网上别人写的:%s/old/new/gc,最后的c是每次替换前询问确认,适合做高风险替换,防止把不想替换的地方也替换掉。

范围替换也完全可控。比如只想替换第5行到第15行之间的内容:

:5,15s/apple/orange/g

查配置文件时,我常用的是先:set nu显示行号,看到某一段的范围之后,再用:5,15s/xxx/yyy/g只处理那一段,避免误伤文件其他位置。

4.3 查找到内容后如何快速跳转

使用/搜索后,vi会自动高亮所有匹配的结果。想取消高亮,可以执行:

:nohlsearch

这个命令很常用,因为高亮有时候会干扰阅读。也可以直接在执行搜索后按Esc再输入:nohl,效果一样。

跳转方面,n和N已经能实现前后跳转。如果要跳到文件的某个具体行号,使用:

:50

回车后光标会跳到第50行。我经常配合报错信息用,比如日志里说"config.php line 32",我直接输入:32就过去了。

4.4 多文件编辑和分屏操作

实际工作中,经常需要对照两个文件做修改。vi支持不退出程序直接打开另一个文件:

:e /etc/nginx/nginx.conf

这个命令会关闭当前文件并打开新的文件。如果想同时看两个文件,可以分屏:

:sp /etc/nginx/conf.d/default.conf

:sp是上下分屏,:vsp是左右分屏。分屏后在两个窗口之间切换,用Ctrl+w加w。比如先按Ctrl+w,再按w,光标就在两个窗口之间来回切换。

这是我在实际服务器上改配置时最常用的方式:左边的窗口开着原始默认配置作参照,右边的窗口写自己的配置,来回切换对照,效率比单独开两个SSH会话高多了。

多文件相关命令作为补充:

命令说明
:e 文件名打开指定文件
:n切换到下一个文件(打开多个文件时)
:N切换到上一个文件
:sp 文件名上下分屏打开文件
:vsp 文件名左右分屏打开文件
Ctrl+w w在分屏窗口间切换
Ctrl+w q关闭当前分屏窗口

多文件配合分屏,是vi真正发挥生产力优势的地方。建议在练习阶段就多用,不要一直停留在只编辑单个小文件。

5. 让vi更好用:.vimrc配置与中文乱码解决

5.1 第一次打开vi时最想改掉的默认行为

vi默认启动后是不显示行号的,编辑配置文件时特别不方便。另外,tab键默认显示为8个空格宽度,会打乱代码对齐,尤其编辑Python或Shell脚本时非常难受。还有,搜索后关键词高亮不取消,一直亮着干扰视线。这三个痛点,都可以通过配置文件解决。

vi的用户级配置文件是~/.vimrc。如果这个文件不存在,就自己创建一个。创建后重启vi,配置就会生效。

vim ~/.vimrc

5.2 常用.vimrc配置项说明

下面这份配置我用了很长时间,每一项都有对应的需求,不盲目堆配置:

set number " 显示行号 syntax on " 开启语法高亮 set autoindent " 自动缩进 set ts=4 " tab宽度为4个空格 set expandtab " 把tab键展开为空格 set shiftwidth=4 " 自动缩进时使用4个空格 set hlsearch " 搜索时高亮 set incsearch " 输入搜索关键词时实时预览 set ignorecase " 搜索忽略大小写 set smartcase " 如果搜索词含大写字母,则区分大小写 set encoding=utf-8 " 内部编码使用utf-8 set fileencodings=utf-8,gbk,gb2312 " 打开文件时尝试的编码顺序 set cursorline " 当前行高亮 set showcmd " 在底部显示正在输入的命令

set expandtab这条要注意,如果你编辑的是Makefile这类严格要求tab键的文件,展开为空格会出问题。那时候可以把配置改成set noexpandtab,或者保持默认,按实际场景来。我一般先默认展开为空格,遇到Makefile再单独处理。

5.3 中文乱码的根因和修法

在服务器上用vi打开一个从Windows上传过来的文件,中文经常显示成乱码。这个问题的根源在于编码不一致:Windows上很多文件默认是GBK或GB2312编码,而Linux终端和vi默认按UTF-8解码,两边对不上,自然就乱码了。

解决办法是告诉vi按什么顺序尝试解码文件。上面配置里的set fileencodings=utf-8,gbk,gb2312就是干这个的。vi打开文件时,会依次尝试utf-8、gbk、gb2312三种编码,找到能正确解码的就用它来显示。配置生效后,再打开常见中文文件基本就不会乱码了。

如果你的终端本身编码没问题,但vi里还是乱码,还有一种情况是文件本身是GBK,vi尝试的顺序里没有GBK,于是按UTF-8强行解码导致乱码。这时可以临时执行:

:e ++enc=gbk

这个命令是让vi用GBK编码重新加载当前文件。如果文件名后缀是.txt,Windows下复制过来的,我经常直接用这个命令救急。

5.4 配置立即生效的方法

改了~/.vimrc之后,不一定非要退出重开vi。在vi里执行:

:source ~/.vimrc

就能立刻加载最新配置,不用中断当前编辑状态。这个命令在调试配置项的时候特别好用:改一行,执行一次source,马上看效果,不满意再改。

如果你手动改完配置但忘了source,很多配置要重启vi才生效,容易产生"我刚才是不是改错了"的错觉。所以我的习惯是每改完一个配置项就立即source一次,并实际操作验证效果。调配置本来就是个试错过程,越早发现问题越好解决。

6. 实操中的常见问题排查与经验心得

6.1 方向键变成A B C D怎么处理

这个问题几乎每个vi新手都遇到过。在命令模式或插入模式按方向键,屏幕上却没有移动光标,而是出现A、B、C、D这样的字符,看起来像是键盘坏了。实际上是因为终端没能正确识别方向键的转义序列,vi把它们当成了普通字符。

最简单的解决办法是:编辑时不要用方向键,改用h j k l四个键移动光标。这也是vi的原始设计本意。如果你实在方向键用习惯了,可以检查一下是不是处于vi compatible模式,执行:

:set nocompatible

这个命令关闭vi的兼容模式,让vim使用自己增强的行为,很多时候方向键问题就解决了。不过更根本的方案还是适应hjkl,毕竟到了没有方向键的终端或者某些特殊环境,你唯一的移动方式就是这四个字母。

6.2 异常退出后的swap文件问题

vi在编辑文件时,会生成一个以.swp结尾的交换文件,用于保存编辑会话的临时数据。如果你在编辑过程中终端突然断线、SSH连接断开,或者忘记保存直接杀掉了vi进程,交换文件不会被自动删除。下次再打开同一个文件时,vi会提示类似这样的信息:

Swap file ".nginx.conf.swp" already exists!

并询问你是只读打开、删除交换文件还是恢复编辑等。如果确定上次编辑的内容不想要了,选删除交换文件的选项(通常是按d)就可以正常打开文件。但如果上次编辑过程中有重要修改没保存,应该选择恢复选项,用vi -r或者按提示执行恢复,把数据捞回来。

一个更稳妥的排查流程是:先打开文件看看当前内容是不是你想要的,再决定是否删除.swp文件。手动删除的命令是:

rm .nginx.conf.swp

注意,这个文件通常是隐藏的,文件名前面带点。删错位置文件备份的数据,会导致无法恢复,所以一定先确认。

6.3 编辑了一半想放弃:不保存退出的正确命令

如果改错了不想保存,很多人着急就按Ctrl+C,发现vi没反应,又开始乱按,最后文件被保存成一个半成品。正确的不保存退出命令是:

:q!

先按冒号进入末行模式,再按q表示退出,感叹号表示强制、不保存修改。这样退出后,文件保持上次保存的状态,你的修改全部丢弃。

如果你做了修改但想正常保存退出,命令是:

:wq

保存并退出,和:x效果相同。还有一点要区分:ZZ(两个大写字母Z)在命令模式下也相当于保存退出,缺点是不好记,所以多数人用:wq。

6.4 给新手的vi学习顺序建议

最后聊一点个人经验。我不建议一上来就背快捷键大全,那样三天就忘光了。比较高效的学习路径是:

  1. 第一周只记六个操作:i进入插入、Esc回命令模式、hjkl移动、:wq保存退出、dd删除行、u撤销。这六招能保证你完成绝大多数基础编辑。
  2. 第二三周补充常用操作:yy复制、p粘贴、/搜索、gg到文件首、G到文件尾、o新建行、数字+G跳转到指定行。这些足够应付日常配置文件修改。
  3. 一个月后再进阶:学:%s/old/new/g全局替换、多文件分屏、数字前缀、配置.vimrc。这些属于效率工具,基础不牢时学容易混乱。

等你用了几个月vi,会发现它最迷人的地方不是单个命令,而是命令之间的组合逻辑。数字前缀、.重复、寄存器,这些机制像积木一样拼在一起,能组合出无数种高效操作。这时候你已经不需要背快捷键表了,看到操作需求,手指自己就知道按什么。

我自己就是从"觉得vi反人类"走到"默认编辑器就是vi"的。现在哪怕在图形界面里,我也习惯打开终端用vi改文件,不是怀旧,是真的顺手。这篇内容基本覆盖了我在真实环境中用到的大多数功能,但vi还有可视模式、宏录制、多窗口等更深入的内容没展开,等你把这里面的基础打牢了,再去摸索那些也不迟。

返回列表