vi 是 Linux/Unix 系统自带的经典文本编辑器,无需额外安装,兼容性极强。vim 是 vi 的增强版(支持语法高亮、代码补全、行号显示等),绝大多数 Linux 发行版会默认安装并将 vi 软链接到 vim,下文统一以 vi 讲解(vim 完全兼容)。
核心特点:有三种工作模式,操作依赖键盘快捷键,无图形化界面,运行轻量,适合服务器端快速编辑文件。
一、vi 的三种核心工作模式
vi 的所有操作都围绕命令模式、输入模式、末行模式展开,模式间可快速切换,这是掌握 vi 的基础。
1. 命令模式(默认模式)
- 打开 vi 后默认进入,无法直接输入文字,用于执行光标移动、复制、粘贴、删除、撤销等快捷操作。
- 任何其他模式下,按Esc 键可快速切回命令模式(按一次没反应可按两次,确保退出其他模式)。
2. 输入模式(编辑模式)
- 用于输入 / 修改文本内容,只有进入此模式才能敲入文字。
- 从命令模式通过触发键进入(如
i/a/o),界面底部会显示-- INSERT --(vim 中)。
3. 末行模式(底线命令模式)
- 用于执行保存、退出、查找替换、行号显示、文件操作等高级命令,命令以冒号 : 开头,输入后按回车执行。
- 从命令模式按 :(冒号)进入,光标会跳到屏幕最底部的末行,等待输入命令。
模式切换总结:
命令模式 → 输入模式:按 i/a/o 等触发键
命令模式 → 末行模式:按 : / ? 等符号
输入模式/末行模式 → 命令模式:按 Esc 键
二、vi 的基础操作:打开 / 关闭文件
1. 打开 vi 并编辑文件
在 Linux 终端直接输入以下命令,回车即可,支持新建文件和编辑已有文件:
# 编辑已有文件,文件路径可绝对/相对
vi 文件名/文件路径
# 示例:编辑当前目录的 test.txt,若不存在则新建
vi test.txt
# 示例:编辑 /root 目录的 config.conf
vi /root/config.conf
- 若文件存在:直接打开并加载文件内容,进入命令模式。
- 若文件不存在:打开空白编辑界面,保存后会在对应路径创建文件。
2. 强制退出 vi(无保存)
若打开文件后未做修改,或想放弃修改直接退出,操作:
- 按 Esc 切回命令模式;
- 按 :q 回车(末行模式命令),即可退出。
- 若文件已修改,
:q会报错(提示No write since last change),需强制放弃修改退出::q!回车(!表示强制)。
3. 保存并退出 vi
- 按 Esc 切回命令模式;
- 按 :wq 回车(
w=write保存,q=quit退出),保存修改并退出。
- 快捷方式:命令模式下直接按 ZZ(大写),等效于
:wq,快速保存退出。
4. 仅保存不退出
- 按 Esc 切回命令模式;
- 按 :w 回车,保存当前修改,继续编辑。
- 若为新建文件,首次保存需指定文件名:
:w 新文件名回车(如:w new.txt)。
三、核心操作 1:命令模式(最常用,必背)
命令模式是 vi 的核心,所有快捷操作都在此模式下执行,无需按回车,按键即执行,以下是高频操作,分大类整理,方便记忆。
(1)光标移动(最基础,纯键盘操作)
vi 中方向键 ↑↓←→ 可直接移动光标,但推荐使用h/j/k/l(服务器端部分环境方向键可能失效,hjkl 是 vi 原生快捷键,兼容性 100%):
| 快捷键 | 功能 | 补充 |
|---|---|---|
| h | 光标左移 1 格 | 同 ← |
| l | 光标右移 1 格 | 同 →(L 的小写) |
| j | 光标下移 1 行 | 同 ↓ |
| k | 光标上移 1 行 | 同 ↑ |
| 0 | 光标跳到当前行开头 | 数字 0,不是字母 O |
| $ | 光标跳到当前行末尾 | 配合 Shift 键 |
| ^ | 光标跳到当前行第一个非空字符 | 区别于 0(0 是行首,包括空格) |
| gg | 光标跳到文件第一行开头 | 快速到文件顶部 |
| G | 光标跳到文件最后一行开头 | 快速到文件底部(Shift+g) |
| nG | 光标跳到第 n 行开头 | n 为数字,如 10G 跳到第 10 行 |
| w | 光标跳到下一个单词的开头 | 以空格 / 标点分隔单词 |
| b | 光标跳到上一个单词的开头 | 反向跳单词 |
| e | 光标跳到当前单词的末尾 | |
| Ctrl+f | 屏幕向下翻一页 | 同 PageDown |
| Ctrl+b | 屏幕向上翻一页 | 同 PageUp |
| Ctrl+d | 屏幕向下翻半页 | |
| Ctrl+u | 屏幕向上翻半页 |
(2)文本删除(剪切)
vi 中删除命令可直接作为剪切使用(删除的内容会暂存缓冲区,可粘贴),高频删除快捷键:
| 快捷键 | 功能 | 补充 |
|---|---|---|
| x | 删除光标所在位置的字符 | 同 Delete 键 |
| X | 删除光标左侧的一个字符 | 同 Backspace 键(Shift+x) |
| dd | 删除光标所在的整行 | 最常用,删除后下一行上移 |
| ndd | 删除从光标行开始的 n 行 | n 为数字,如 3dd 删除当前行 + 下两行 |
| d0 | 删除光标左侧到行首的所有字符 | 保留光标所在字符 |
| d$ | 删除光标右侧到行尾的所有字符 | 保留光标所在字符 |
| dw | 删除光标所在位置到下一个单词开头 | |
| db | 删除光标所在位置到上一个单词开头 | |
| dG | 删除从光标行到文件最后一行的所有内容 | |
| dgg | 删除从光标行到文件第一行的所有内容 |
(3)复制与粘贴
复制内容暂存 vi 缓冲区,粘贴可多次执行,高频快捷键:
| 快捷键 | 功能 | 补充 |
|---|---|---|
| yy | 复制光标所在的整行 | 最常用,整行复制 |
| nyy | 复制从光标行开始的 n 行 | n 为数字,如 5yy 复制当前行 + 下 4 行 |
| y0 | 复制光标左侧到行首的所有字符 | |
| y$ | 复制光标右侧到行尾的所有字符 | |
| yw | 复制光标所在位置到下一个单词开头 | |
| p | 将缓冲区内容粘贴到光标下方(整行)/光标右侧(字符) | 最常用,小写 p |
| P | 将缓冲区内容粘贴到光标上方(整行)/光标左侧(字符) | 大写 P,反向粘贴 |
(4)撤销与恢复
操作失误时快速回滚,必备快捷键:
| 快捷键 | 功能 | 补充 |
|---|---|---|
| u | 撤销上一步的操作 | 可多次按,逐步撤销 |
| U | 撤销对当前行的所有修改 | 仅针对当前行,按一次即可 |
| Ctrl+r | 恢复被撤销的操作 | 反向撤销,如撤销了 u,按 Ctrl+r 还原 |
(5)其他高频命令模式操作
| 快捷键 | 功能 | 实用场景 |
|---|---|---|
| r | 替换光标所在的单个字符 | 无需进入输入模式,如 r+1 将光标字符换成 1 |
| R | 进入连续替换模式 | 按 Esc 退出,替换光标后所有字符,直到按 Esc |
| cc | 删除光标所在行并进入输入模式 | 快速编辑整行 |
| cw | 删除光标到下一个单词开头并进入输入模式 | 快速编辑单词 |
| ~ | 切换光标所在字符的大小写 | 按一次切换一次,如 a→A,B→b |
| J | 将当前行与下一行合并 | 消除行间距,大写 J |
四、核心操作 2:输入模式(编辑文本)
输入模式无快捷键,唯一目的是输入 / 修改文本,只需掌握从命令模式进入输入模式的触发键,根据编辑位置选择即可,推荐记住i/a/o三个核心触发键,满足 99% 的编辑需求。
高频进入输入模式的触发键
| 触发键 | 功能 | 实用场景 |
|---|---|---|
| i | 在光标所在位置前插入文本 | 最常用,光标前编辑 |
| I | 在当前行第一个非空字符前插入文本 | 快速在行首编辑,如加注释 |
| a | 在光标所在位置后追加文本 | 光标后编辑,避免覆盖光标字符 |
| A | 在当前行末尾追加文本 | 快速在行尾编辑,如加标点 / 回车 |
| o | 在光标所在行下方新建一行并进入输入模式 | 快速换行,新行编辑(小写 o) |
| O | 在光标所在行上方新建一行并进入输入模式 | 快速在上行插入新行(大写 O) |
| s | 删除光标所在字符并进入输入模式 | 替换单个字符并编辑 |
| S | 删除光标所在整行并进入输入模式 | 等效于 cc,快速重写整行 |
退出输入模式:按Esc 键,立即切回命令模式。
五、核心操作 3:末行模式(高级命令,必背)
末行模式以冒号 : 开头,所有命令输入后按回车执行,用于执行保存、退出、查找替换、行号显示等操作,以下是开发 / 运维高频使用的末行命令,分大类整理。
(1)文件操作(保存 / 退出 / 另存为)
基础操作,前文已提,此处汇总方便查阅:
| 命令 | 功能 | 备注 |
|---|---|---|
| :w | 保存当前修改 | 不退出 |
| :w! | 强制保存 | 针对只读文件(如 root 权限的文件) |
| :q | 退出 vi | 无修改时可用 |
| :q! | 强制退出,放弃所有修改 | 修改后不想保存直接退出 |
| :wq | 保存并退出 | 等效于 ZZ |
| :wq! | 强制保存并退出 | 针对只读文件的修改保存 |
| :w 新文件名 | 将文件另存为新文件 | 原文件不变,新建文件保存内容 |
| :r 文件名 | 读取其他文件的内容,插入到光标所在行下方 | 快速合并文件,如:r /etc/hosts |
(2)行号操作(编程 / 排错必备)
vi 默认不显示行号,编程时查错、定位行需手动开启,行号命令仅对当前编辑有效,关闭 vi 后失效:
| 命令 | 功能 | 备注 |
|---|---|---|
| :set nu | 显示行号 | nu=number,每行开头显示行号 |
| :set nonu | 关闭行号显示 | nonu=no number,恢复无行号 |
| :set rnu | 显示相对行号 | 光标行为 0,上下行依次为 1、2...,方便快速跳行 |
| :n | 光标跳到第 n 行 | 等效于命令模式的 nG,如:10 跳到第 10 行 |
(3)文本查找(快速定位内容)
支持正向查找和反向查找,查找后可快速跳转到匹配项,是大文件编辑的必备功能:
正向查找(从光标向下找)
- 命令模式按 /(斜杠),进入末行模式;
- 输入要查找的关键词,按回车;
- 查找结果:光标跳到第一个匹配项,关键词会高亮(vim 中)。
反向查找(从光标向上找)
- 命令模式按 ?(问号),进入末行模式;
- 输入要查找的关键词,按回车;
- 查找结果:光标跳到向上的第一个匹配项。
查找后跳转到匹配项
| 快捷键 | 功能 | 备注 |
|---|---|---|
| n | 跳转到下一个匹配项 | 正向查找→向下跳,反向查找→向上跳 |
| N | 跳转到上一个匹配项 | 与 n 相反,正向查找→向上跳,反向查找→向下跳 |
取消查找高亮
查找后关键词会一直高亮,执行以下命令取消:
:nohl # nohl=no highlight,取消高亮
(4)文本替换(批量修改,超实用)
vi 支持单行替换和全局替换,支持精确匹配和模糊匹配,使用s / 旧内容 / 新内容 / 标志位的格式,是批量修改文本的核心功能,必背!
替换基本格式
:范围 s/旧字符串/新字符串/标志位
- 范围:指定替换的行范围,如
1,10(1-10 行)、%(所有行,全局)、.(当前行)、$(最后一行); - s:substitute,替换命令的核心;
- 标志位:
g(global,全局替换,一行内所有匹配项)、c(confirm,替换前确认)、i(ignore case,忽略大小写); - 分隔符:
/可替换为#或@,适合旧 / 新内容包含/的场景(如路径),如:1,$ s#/usr/local#/opt#g。
高频替换示例(重点)
# 1. 替换**当前行**第一个"old"为"new"
:s/old/new
# 2. 替换**当前行**所有"old"为"new"(行内全局)
:s/old/new/g
# 3. 替换**1-10 行**所有"old"为"new"
:1,10 s/old/new/g
# 4. 替换**所有行**所有"old"为"new"(全局替换,最常用)
:% s/old/new/g
# 5. 全局替换,**替换前确认**(避免误改,推荐)
:% s/old/new/gc
# 执行后会提示:replace with new (y/n/a/q/l/^E/^Y)?
# y=确认替换,n=跳过,a=全部替换,q=退出,l=替换当前并退出
# 6. 全局替换,**忽略大小写**(如 Old/OLD/old 都替换)
:% s/old/new/gci
# 7. 替换路径(用#做分隔符,避免/冲突)
:% s#/home/user#/root#g
(5)窗口分割(多文件同时编辑)
vi 支持横向分割和纵向分割窗口,可同时编辑多个文件,适合对比文件、跨文件复制内容:
| 命令 | 功能 | 窗口切换 |
|---|---|---|
| :sp 文件名 | 横向分割窗口,打开新文件 | Ctrl+w + 方向键 /h/j/k/l 切换窗口 |
| :vsp 文件名 | 纵向分割窗口,打开新文件 | Ctrl+w + w 快速循环切换窗口 |
| :close | 关闭当前分割窗口 | 保留主窗口 |
| :only | 关闭所有分割窗口,仅保留当前窗口 |
(6)其他高频末行命令
| 命令 | 功能 | 实用场景 |
|---|---|---|
| :set ai | 开启自动缩进 | 编程时,换行自动对齐上一行缩进 |
| :set noai | 关闭自动缩进 | |
| :set ts=4 | 设置制表符 Tab为 4 个空格 | 编程规范,默认 Tab 是 8 个空格 |
| :set sw=4 | 设置缩进步长为 4 个空格 | 配合自动缩进使用 |
| :map 快捷键 命令 | 自定义快捷键 | 如:map :wq,按 F5 保存退出(是回车) |
| :! 终端命令 | 在 vi 中执行Linux 终端命令,执行后返回 vi | 无需退出 vi,如:!ls 查看当前目录文件,:!pwd 查看当前路径 |
六、vi 进阶技巧(提升效率,运维 / 开发必备)
1. 快速注释 / 取消注释代码
编程时批量注释行,用替换命令实现(以 Python 的 #注释、Shell 的 #注释为例):
# 1. 给 1-20 行**添加#注释**(行首加#)
:1,20 s/^/#/g
# ^ 表示行首,将行首替换为#
# 2. 取消 1-20 行的#注释(删除行首的#)
:1,20 s/^#//g
# 给 C/C++/Java 添加//注释(1-20 行)
:1,20 s/^/\/\//g
# 取消//注释
:1,20 s/^\/\///g
2. 批量删除空行
编辑配置文件时,快速清理空行,用全局替换:
:% s/^$//g
# 删除纯空行
:% s/^\s*$//g
# 删除包含空格/制表符的空行(\s*表示任意空白字符)
3. 复制指定行到指定位置
如将 5-10 行复制到 20 行下方:
- 命令模式按
5,10 yy复制 5-10 行; - 按
20G跳到 20 行; - 按
p粘贴到 20 行下方。
4. 远程编辑服务器文件
通过 scp 协议直接编辑远程服务器的文件,无需先下载再上传:
vi scp://远程用户@远程 IP:端口/文件路径
# 示例:编辑 192.168.1.100 的/root/test.txt,端口 22
vi scp://[email protected]:22/root/test.txt
5. 恢复意外关闭的文件
vi 编辑时会生成临时文件(以.swp 结尾),若意外关闭 vi(如终端崩溃),重新打开文件时会提示恢复,按提示操作即可:
vi 文件名
# 提示后按 R 恢复文件,恢复后删除临时文件:rm .文件名.swp
七、vi 常见问题与解决
1. 方向键变成 ABCD,无法正常移动光标
原因:进入了纯 vi 模式(非 vim),纯 vi 不支持方向键,仅支持 hjkl。解决:
- 方法 1:使用 hjkl 移动光标(推荐,兼容性最好);
- 方法 2:安装 vim 并设置默认,执行
yum install -y vim(CentOS)/apt install -y vim(Ubuntu),然后alias vi=vim永久生效需写入~/.bashrc。
2. 编辑文件时提示 "readonly",无法保存
原因:文件是只读权限,或非 root 用户编辑 root 所属文件。解决:
- 强制保存:
:w!回车; - 若强制保存失败,切换到 root 用户:
sudo vi 文件名。
3. 查找关键词时无高亮,或替换后无效果
原因:进入了纯 vi 模式,或未开启高亮,或替换格式错误。解决:
- 开启高亮:
:set hlsearch; - 检查替换格式:全局替换必须加
%和g,如% s/old/new/g; - 切换到 vim:直接输入
vim 文件名打开。
4. 误操作删除了重要内容,如何恢复
解决:
- 立即按
u撤销操作,多次按u逐步撤销; - 若撤销错了,按
Ctrl+r恢复; - 若已退出 vi,未保存则无法恢复,保存后可通过服务器的文件备份恢复。
5. vi 中无法输入中文,或输入中文乱码
原因:Linux 终端的字符编码不是 UTF-8,或 vi 未设置编码。解决:
- 查看终端编码:
echo $LANG,确保是zh_CN.UTF-8或en_US.UTF-8; - vi 中设置编码:
:set encoding=utf-8,:set fileencoding=utf-8。
八、vi 快捷键速查(精华版,打印背诵)
命令模式(核心,纯按键)
- 光标:hjkl(上下左右)、gg(首行)、G(尾行)、nG(第 n 行)、0(行首)、$(行尾)
- 删除:x(单个字符)、dd(整行)、ndd(n 行)、dG(到尾行)
- 复制:yy(整行)、nyy(n 行)、p(粘贴)
- 撤销:u(撤销)、Ctrl+r(恢复)
- 快捷:ZZ(保存退出)、r(替换单个字符)、o(下行新建)
输入模式(触发键)
- i(光标前)、a(光标后)、o(下行新建)、I(行首)、A(行尾)、O(上行新建)
末行模式(冒号开头,回车执行)
- 保存退出::w、:q、:wq、:q!
- 行号::set nu、:set nonu
- 查找:/ 关键词(正向)、? 关键词(反向)、n(下一个)、:nohl(取消高亮)
- 替换:% s / 旧 / 新 /g(全局)、% s / 旧 / 新 /gc(全局确认)
- 终端命令::!ls(执行终端命令)
九、学习建议
- 先记核心快捷键:hjkl、dd、yy、p、u、i/a/o、:wq、:q!,这些是最常用的,占 vi 操作的 90%;
- 刻意练习:不要依赖图形化编辑器,在 Linux 终端反复编辑文件(如 test.txt),熟悉模式切换;
- 结合实际场景:编辑配置文件(如 /etc/profile、/etc/nginx/nginx.conf)、编写简单脚本(如 shell、python),在实战中强化记忆;
- 过渡到 vim:vi 学会后,直接使用 vim,其语法高亮、代码补全、折叠等功能会大幅提升效率。
vi 是 Linux 工程师的必备技能,看似快捷键多,实则掌握核心操作后会发现极其高效,熟练后编辑文件的速度远超图形化编辑器,建议花 1-2 天刻意练习,形成肌肉记忆以提升效率。


