一、vi 的历史与定位
起源与发展
vi 由 Bill Joy 于 1976 年为 BSD Unix 系统开发,是早期 Unix/Linux 系统的标准文本编辑器。其设计哲学是“小即是美”,仅通过键盘操作实现高效文本处理,成为程序员和系统管理员的必备工具。
核心特性
模式化操作:通过普通模式、插入模式、底行模式的切换实现复杂编辑。
轻量化:无需图形界面,纯字符模式运行,资源占用极低。
可定制性:支持通过配置文件(如 .vimrc)和插件扩展功能(Vim 特性)。
vi 与 Vim 的关系
Vim(Vi IMproved)是 vi 的增强版本,兼容 vi 命令并新增语法高亮、多光标编辑、插件系统等功能。现代 Linux 系统通常预装 Vim,但 vi 命令仍广泛用于兼容性场景。
二、vi 的三种核心模式
- 普通模式(Normal Mode)
功能:光标移动、文本删除/复制/粘贴、模式切换。
进入方式:启动 vi 时默认进入,或从插入模式按 Esc 返回。
常用命令:
hjkl:左/下/上/右移动光标。
gg:跳转到文件首行,G 跳转末行。
dd:删除当前行,yy 复制当前行。 - 插入模式(Insert Mode)
功能:输入或修改文本内容。
进入方式:
i:在光标前插入。
a:在光标后插入。
o:在当前行下方插入新行。
退出方式:按 Esc 返回普通模式。 - 底行模式(Last Line Mode)
功能:文件操作(保存/退出)、全局搜索、显示行号等。
进入方式:普通模式下按 :。
常用命令:
:w 保存,:q 退出,:wq 保存并退出。
:set nu 显示行号,:set nonu 关闭行号。
/pattern 搜索字符串,n 跳转下一个匹配项。
三、vi 的高级操作技巧
- 文本块操作
块选择:按 Ctrl+v 进入列块模式,选择多行后按 d 删除或 y 复制。
行内操作:dw 删除当前单词,cw 替换当前单词。 - 查找与替换
全局替换:在底行模式执行 :%s/old/new/g(全文替换)或 :10,20s/old/new/g(指定行范围替换)。
确认替换:添加 c 参数(如 :%s/old/new/gc),逐个确认替换。 - 多窗口与分屏
分屏命令:
:split 水平分屏,:vsplit 垂直分屏。
Ctrl+w + hjkl 切换窗口。
标签页::tabnew 新建标签,:tabnext 切换标签。
四、vi 与 Vim 的关键差异
特性 vi Vim 来源
语法高亮 不支持 支持
插件系统 无 丰富(如 NERDTree、YouCompleteMe)
多光标编辑 不支持 支持(通过插件或内置命令)
编码支持 基础 支持 UTF-8 等多种编码
撤销/重做 单次撤销(u) 多级撤销(u 和 Ctrl+r)
五、vi 的学习路径与资源
入门练习
掌握模式切换(普通 ↔ 插入 ↔ 底行)。
练习基本命令:i、a、dd、yy、:wq。
进阶技巧
学习正则表达式搜索(如 /\d{3} 匹配三位数字)。
掌握宏录制(q{寄存器} 开始录制)。
推荐资源
书籍:《vi/vim 使用大全》(Practical Vim)。
在线教程:Vim 官方文档(:help 命令)、Linux 中国社区的 vi 指南。
练习工具:VimGym(交互式练习平台)。
六、典型应用场景
服务器配置管理
通过 SSH 登录远程服务器,使用 vi 编辑配置文件(如 /etc/nginx/nginx.conf)。
示例:快速注释多行配置:
vim
:10,20s/^/#/ " 注释第10到20行
脚本编写
编辑 Shell/Python 脚本,利用 :set number 显示行号辅助调试。
日志分析
使用 /error 搜索日志中的错误关键词,结合 n 跳转定位问题。
七、常见问题与解决方案
误删文本
使用 u 撤销操作,Ctrl+r 重做。
文件只读
强制保存::w!(需文件权限允许),或使用 sudo 重新打开。
编码混乱
设置文件编码::set fileencoding=utf-8。