视频时长: 28分28秒
概述#
本节视频讲解 vi 编辑器的三种核心模式(一般模式、插入模式、命令行模式)及其切换方式,演示光标移动、翻页、文本查找等常用操作。vi 是 Linux/Unix 系统中最基础的文本编辑器,几乎所有 Linux 发行版都预装了它。掌握 vi 是运维和开发工作的必备技能。
[TOC]
核心要点#
1. vi 与 vim 的关系#
发展历史#
vi(Visual Interface)诞生于 1976 年,由 Bill Joy 在加州大学伯克利分校开发,是 Unix 系统最早的屏幕编辑器。它的前身是行编辑器 ex,vi 在 ex 的基础上增加了全屏可视编辑能力。
vim(Vi Improved)由 Bram Moolenaar 于 1991 年发布,在 vi 基础上增加了大量功能,包括语法高亮、多级撤销、代码折叠、插件系统等。今天几乎所有的 Linux 发行版都默认使用 vim 替代原始 vi。
| 特性 | vi | vim |
|---|---|---|
| 语法高亮 | 不支持 | 支持 |
| 多级撤销(Ctrl+r 重做) | 不支持(只有一次撤销) | 支持无限撤销 |
| 代码折叠 | 不支持 | 支持 |
| 分屏编辑 | 不支持 | 支持(:split / :vsplit) |
| 插件系统 | 不支持 | 支持(通过 .vimrc 和插件管理器) |
| 可视化选择 | 不支持 | 支持(可视模式 v / V / Ctrl+v) |
| 跨平台 | Unix | 几乎所有操作系统 |
Ubuntu 中的实际情况#
Ubuntu 系统中 vi 命令实际指向的是 vim.tiny(精简版 vim),保留了 vi 的兼容性,但功能受限。可以通过以下命令查看:
$ which vi
/usr/bin/vi
$ ls -l /usr/bin/vi
lrwxrwxrwx 1 root root 20 Mar 15 2024 /usr/bin/vi -> /etc/alternatives/vi
$ ls -l /etc/alternatives/vi
lrwxrwxrwx 1 root root 18 Mar 15 2024 /etc/alternatives/vi -> /usr/bin/vim.tiny推荐安装完整版 vim:
$ sudo apt update
$ sudo apt install vim -y安装后,可以配置 update-alternatives 将 vi 指向完整版 vim,或者直接使用 vim 命令。
学习建议#
对于初学者,强烈建议运行 vim 自带的教学工具:
$ vimtutorvimtutor 是一个约 30 分钟的交互式教程,覆盖了 vim 的核心操作。支持多语言,在中文系统中会自动使用中文版。
2. 三种模式系统#
vi/vim 编辑器与普通文本编辑器的最大区别在于模式系统。现代编辑器(如 VS Code、记事本)是"无模式"的,任何时候按下键盘都是在输入文本。而 vi/vim 有三种工作模式,每种模式下的按键行为完全不同。
这是 vi 最核心的设计理念,也是初学者需要花时间适应的部分。
三种模式概览#
| 模式 | 用途 | 进入方式 |
|---|---|---|
| 一般模式(Normal) | 浏览文件、执行命令(删除、复制、粘贴等) | 打开文件时默认进入;在插入模式按 Esc |
| 插入模式(Insert) | 输入/编辑文本 | 在一般模式按 i、a、o、I、A、O 等 |
| 命令行模式(Command-line) | 保存文件、退出、查找替换、设置选项 | 在一般模式按 :(冒号) |
模式切换图示#
打开文件
|
v
+----------+
i/a/o | | :
+--------->| 一般模式 |<------+
| | (Normal) | |
| | | |
| +----------+ |
| ^ ^ |
v | | |
+----------+ Esc | | Esc +------------+
| |--------+ +--------| |
| 插入模式 | | 命令行模式 |
| (Insert) | | (Cmd-line) |
+----------+ +------------+关键规则:插入模式和命令行模式不能直接互相切换,必须经过一般模式作为中转。
判断当前模式#
- 一般模式:左下角无特殊提示(或显示文件名)
- 插入模式:左下角显示
-- INSERT --或-- 插入 -- - 命令行模式:左下角显示
:开头的命令输入区
3. 插入模式快捷键详解#
从一般模式进入插入模式有多种方式,每种方式适用于不同场景。选择正确的插入方式可以大大提高编辑效率。
| 键 | 全称 | 功能 | 使用场景 |
|---|---|---|---|
| i | insert | 在光标前插入 | 最常用,在字符前开始输入 |
| a | append | 在光标后插入 | 在字符后追加内容 |
| I | Insert at line start | 跳转到行首并插入 | 在行开头添加注释或缩进 |
| A | Append at line end | 跳转到行尾并插入 | 在行尾添加分号、文本 |
| o | open below | 在下方新建一行并插入 | 在段落之间添加新行 |
| O | Open above | 在上方新建一行并插入 | 在当前行上方插入内容 |
实操示例#
假设有以下文本,光标在字母 w 处:
hello world| 按键 | 结果 | 说明 |
|---|---|---|
| i | hello | world |
| a | hello w | orld |
| I | hello world | |
| A | hello world | |
| o | hello world 后换行新建 | 在下方新建空白行并定位光标 |
| O | 换行后 hello world | 在上方新建空白行并定位光标 |
4. 替换与修改#
除了插入模式,vi/vim 还提供了替换和修改操作,这些操作在一般模式下直接执行,无需进入插入模式。
| 键 | 功能 | 说明 |
|---|---|---|
| r | 替换光标处一个字符 | 按 r 后再按目标字符,替换后自动回到一般模式 |
| R | 进入替换模式(连续替换) | 输入的字符会逐个覆盖光标后的原有字符,直到按 Esc |
| s | 删除光标处字符并进入插入模式 | “substitute” 的缩写,相当于 xi |
| S | 删除整行并进入插入模式 | “Substitute line” 的缩写,相当于 cc |
| cw | 删除光标后一个单词并进入插入模式 | “change word” |
| C | 删除光标到行尾并进入插入模式 | “Change to end” |
实操示例#
# 假设原文为:Hello World!
# 光标在 W 处
r J # 结果:Hello Jorld! (W 变成 J,光标不动,仍在一般模式)
R Java # 结果:Hello Java! (逐个替换,按 Esc 退出)
# 假设原文为:foo_bar_baz,光标在第一个下划线处
s # 删除下划线,进入插入模式5. 一般模式命令详解#
一般模式是 vi/vim 的"指挥中心",绝大多数操作都在此模式下完成。
5.1 光标移动#
| 键 | 方向 | 记忆技巧 |
|---|---|---|
| h | 左 | h 在最左侧(最左边的字母) |
| j | 下 | j 像一个向下的箭头 |
| k | 上 | k 像一个向上的箭头 |
| l | 右 | l 在最右侧(最右边的字母) |
为什么用 hjkl 而不是方向键? vi 诞生时,当时的键盘(如 ADM-3A 终端)没有独立的方向键,hjkl 就是方向键的标记位置。使用 hjkl 可以让你在编辑时手不离开主键盘区域,提高效率。建议从一开始就养成使用 hjkl 的习惯。
5.2 单词级移动#
| 键 | 功能 |
|---|---|
| w | 跳到下一个单词开头(word) |
| b | 跳到上一个单词开头(back) |
| e | 跳到当前/下一个单词结尾(end) |
# 示例:The quick brown fox(光标在开头)
# 按 w -> The |quick brown fox
# 再按 w -> The quick |brown fox
# 按 b -> The |quick brown fox(回退)5.3 页面与文件级移动#
| 键 | 功能 |
|---|---|
| Ctrl+f | 向下翻一页(Forward) |
| Ctrl+b | 向上翻一页(Backward) |
| Ctrl+d | 向下翻半页(Down) |
| Ctrl+u | 向上翻半页(Up) |
| gg | 跳到文件第一行 |
| G | 跳到文件最后一行 |
| nG 或 :n | 跳到第 n 行 |
| 0(数字零) | 跳到行首 |
| $ | 跳到行尾 |
实操示例#
# 打开一个长文件并快速定位
vim /var/log/syslog
gg # 跳到文件开头
G # 跳到文件末尾
100G # 跳到第 100 行
:500 # 也跳到第 500 行(在命令行模式下)
Ctrl+f # 向下翻页
Ctrl+b # 向上翻页5.4 文本查找#
| 键 | 功能 |
|---|---|
| /text | 向下(文件尾部方向)查找 text |
| ?text | 向上(文件头部方向)查找 text |
| n | 跳转到下一个匹配项 |
| N | 跳转到上一个匹配项 |
# 在一般模式下
/error # 查找 "error"
?warning # 反向查找 "warning"
# 找到后
n # 下一个匹配
N # 上一个匹配
# 查找选项
:set hlsearch # 高亮所有匹配项(:set hls)
:set nohlsearch # 取消高亮(:set nohls)
:set incsearch # 增量搜索(每输入一个字符实时匹配)大小写敏感性:
:set ignorecase # 查找时忽略大小写(:set ic)
:set smartcase # 智能大小写:全部小写时忽略大小写,有大写时区分大小写6. 实用命令速查#
6.1 文件操作#
| 命令 | 说明 |
|---|---|
:w | 保存文件(write) |
:q | 退出(quit) |
:q! | 强制退出,不保存修改 |
:wq 或 :x | 保存并退出 |
:w filename | 另存为 filename |
:e filename | 打开另一个文件(edit) |
:r filename | 将 filename 的内容读入当前光标位置 |
6.2 环境检查命令#
# 在 Linux 终端中执行
which vi # 查看 vi 命令的实际路径
ls -l /usr/bin/vi # 查看 vi 是否为符号链接
vim --version # 查看 vim 版本和编译选项
vim --version | head # 只看头部信息7. 初学者配置建议(.vimrc)#
vim 的配置文件是 ~/.vimrc(用户级别),通过配置可以让 vim 更加易用。以下是一个适合初学者的基础配置:
" 基础设置
set number " 显示行号
set relativenumber " 显示相对行号(便于跳转)
set cursorline " 高亮当前行
set showmatch " 高亮匹配的括号
set ruler " 右下角显示光标位置
" 搜索设置
set hlsearch " 高亮搜索结果
set incsearch " 增量搜索(实时匹配)
set ignorecase " 搜索时忽略大小写
set smartcase " 智能大小写
" 缩进设置
set autoindent " 自动缩进
set smartindent " 智能缩进
set tabstop=4 " Tab 显示为 4 个空格宽度
set shiftwidth=4 " >> 缩进使用 4 个空格
set expandtab " 将 Tab 转换为空格
" 编码
set encoding=utf-8 " 使用 UTF-8 编码
set fileencodings=utf-8,gbk,gb2312,cp936 " 自动检测编码顺序
" 快捷键
nmap <space> <PageDown> " 空格键向下翻页
" 禁用兼容模式(必须放在最前面)
set nocompatible配置文件创建方式:
# 创建或编辑 .vimrc
vim ~/.vimrc
# 让配置立即生效(无需重启 vim)
:source ~/.vimrc8. 常见操作场景#
场景一:编辑系统配置文件#
# 编辑 /etc/apt/sources.list(需要 sudo)
sudo vim /etc/apt/sources.list
# 在 vim 中:
# gg - 跳到文件开头
# /main - 查找 "main"
# n - 跳到下一个匹配
# i - 进入插入模式修改
# Esc - 回到一般模式
# :wq - 保存退出场景二:编写 Shell 脚本#
vim myscript.sh
# 在 vim 中:
i # 进入插入模式
#!/bin/bash # 输入 shebang
echo "Hello World" # 输入脚本内容
Esc # 回到一般模式
:w # 保存(不退出)
:!bash % # 运行当前脚本测试(% 代表当前文件名)
:q # 退出场景三:查看日志文件(只读模式)#
# 使用 -R 参数以只读模式打开
vim -R /var/log/syslog
# 或使用 view 命令(等同于 vim -R)
view /var/log/syslog
# 在只读模式中:
G # 跳到末尾(最新日志)
?error # 反向查找 "error"
n # 向上找上一个匹配
:q # 退出9. 初学者常见问题 FAQ#
Q1: 进入 vi 后无法输入文字,按键变成各种奇怪操作?
A: 这是因为 vi 打开后默认处于一般模式,不是插入模式。按 i 键进入插入模式,左下角会出现 -- INSERT -- 提示,这时才能正常输入文字。
Q2: 不知道自己在哪个模式怎么办?
A: 按 Esc 键多次(听到"滴"声或闪屏),确保回到一般模式。在一般模式下按 i 进入插入模式,按 : 进入命令行模式。
Q3: vi 和 vim 有什么区别,应该学哪个?
A: 学 vim。vim 完全兼容 vi 的所有操作,同时提供了更多实用功能。现代 Linux 系统中的 vi 命令通常就是 vim 的别名。建议直接运行 vimtutor 开始学习。
Q4: 方向键能用吗? A: 能用,但不推荐。hjkl 能让你手不离开主键盘区域,编辑效率更高。从初学阶段就刻意练习 hjkl,一两周即可适应。
Q5: 误操作后如何撤销?
A: 在一般模式下按 u(undo)撤销上一次操作。按 Ctrl+r(redo)重做被撤销的操作。vim 支持多级撤销,可以一直按 u 退回到打开文件时的状态。
Q6: 如何复制粘贴?
A: 在一般模式下,yy 复制当前行,p 粘贴到下一行,P 粘贴到上一行。dd 剪切(删除)当前行。
Q7: 光标移到了行中间,如何快速回到行首或行尾?
A: 按 0(数字零)跳到行首,按 $ 跳到行尾。
Q8: 怎么知道当前在哪一行?
A: 按 Ctrl+g 显示文件名和当前行号。也可以在 .vimrc 中配置 set ruler,让 vim 在右下角持续显示行号和列号。
Q9: 编辑了一半想退出但不想保存?
A: 按 Esc 确保在一般模式,然后输入 :q!(quit, no write),强制退出不保存。
Q10: 如何快速在文件中跳转到特定行?
A: 按 数字 + G,例如 50G 跳到第 50 行。也可以在命令行模式下输入 :50。
10. vim 与其他编辑器对比#
| 特性 | vim | nano | VS Code | Notepad++ |
|---|---|---|---|---|
| 模式编辑 | 是(三种模式) | 否(无模式) | 否(可通过插件模拟) | 否 |
| 启动速度 | 极快(<0.1s) | 快 | 慢(数秒) | 中等 |
| 内存占用 | 极小(~10MB) | 极小 | 大(~500MB+) | 中等 |
| SSH 远程编辑 | 原生支持 | 原生支持 | 需额外配置 | 不支持 |
| 图形界面 | 无(终端内) | 无(终端内) | 有 | 有 |
| 插件生态 | 丰富(通过 vim-plug 等) | 极少 | 极丰富 | 中等 |
| 学习曲线 | 陡峭 | 平缓 | 平缓 | 平缓 |
| 适合场景 | 服务器管理、快速修改配置文件 | 简单文本编辑 | 大型项目开发 | Windows 桌面编辑 |
什么时候用 vim?
- 通过 SSH 连接远程服务器编辑文件
- 在没有图形界面的终端环境中工作
- 需要快速修改配置文件
- 追求极致编辑效率
什么时候用 VS Code 等 IDE?
- 大型项目开发,需要代码补全、调试、Git 图形化
- 需要预览 Markdown、查看图片等非纯文本操作
- 团队协作,使用相同的开发环境
建议:两种工具都要掌握,根据场景选择最合适的。
11. 进阶扩展#
- 可视模式(v / V / Ctrl+v):可视化选择文本区域
- 删除与修改命令(d / c / x / dd / cc)
- 复制粘贴与寄存器操作(y / p / “+y 系统剪贴板)
- 搜索替换(:s/old/new/g / :%s/old/new/gc)
- 多文件与分屏编辑(:split / :vsplit / :tabnew)
- 录制宏(q 寄存器录制 + @ 回放)
- 插件管理器(vim-plug)基础使用
注意事项#
- vi/vim 打开后默认处于一般模式,按
i才能开始输入 - 使用 hjkl 前确保 Caps Lock 已关闭(大写锁定会改变按键行为)
- 小写
n= 查找下一个匹配,大写N= 查找上一个匹配 - 小写
r= 替换光标处单个字符,大写R= 进入连续替换模式 - 任何时候不确定当前状态时,多按几次
Esc回到一般模式 - 编辑系统配置文件时建议先用
sudo cp备份原文件 - 退出时用
:q!放弃修改,用:wq或:x保存退出
