vi 编辑器核心命令速查(完整指南)
文本编辑器是所有计算机系统中不可或缺的常用工具。在 UNIX 和 Linux 环境下,尽管存在 ex、sed 等众多编辑器,但 vi 无疑是人气最高、流传最久远的一款。vi 的命令体系较为庞杂,初学者往往感到无从下手。本文整理了一份 vi 三种模式下的核心命令速查表,帮助读者快速掌握 vi 的使用技巧,欢迎补充交流。
文本输入模式
在 vi 的文本输入模式下,操作逻辑非常直观:
- a:在光标后插入(追加)文本
- A:在当前行末尾追加文本
- i:在光标前插入文本
- o:在光标下方新建一行并进入插入模式
末行模式
末行模式(通过冒号 : 进入)是 vi 强大的命令控制中心:
- :w:将缓冲区内容写入文件(保存),继续编辑
- :w new_filename:将缓冲区内容另存为新文件 new_filename
- :wq 或 ZZ:保存缓冲区内容后退出 vi
- :q!:放弃所有修改,强制退出 vi
- :wq!:强制保存缓冲区内容后退出(若为文件所有者,将忽略只读属性)
- e!:撤销自上次保存以来所有未保存的修改
- u:撤销最近一次编辑操作
命令模式(光标移动)
命令模式下,光标移动操作是日常使用频率最高的基础技能:
- j(或向下箭头):向下移动一行
- k(或向上箭头):向上移动一行
- h(或向左箭头):向左移动一个字符
- l(或向右箭头):向右移动一个字符
- 空格:向右移动一个字符
- w:向前移动一个单词(含标点)
- b:向后移动一个单词(含标点)
- $:移动到当前行行尾
- 0(零)或 ^:移动到当前行行首
- 回车:移动到下一行行首
编辑与删除操作(命令模式 & 末行模式)
编辑与删除操作是 vi 高效编辑的关键所在:
- x(小写):删除光标位置处的字符
- dw:删除当前单词(从光标处到单词末尾)
- 3dw:删除从光标开始的三个单词
- dd:删除光标所在的整行
- 3dd:删除连续三行
- yy:复制(拉出)当前行到剪贴板
- p(小写):将剪贴板内容粘贴到当前行下方
- P(大写):将剪贴板内容粘贴到当前行上方
- :set nu:显示行号
- :set nonu:隐藏行号
- :set showmode:在屏幕底部显示当前操作模式
- :set noshowmode:关闭模式显示
- :set:显示所有 vi 变量及部分设置
- :set all:显示所有 vi 变量及其当前值
- G:跳转到文件的最后一行
- :21:跳转到第 21 行
- /string:从当前位置向后搜索字符串 string
- ?string:从当前位置向前搜索字符串 string
- n:重复上一次搜索(同方向)
Solaris vi 命令专篇
以下分类更加细化,适用于复杂编辑场景,尤其在 UNIX/Linux 服务器运维中非常实用。
进入 vi 的命令
- vi filename:打开或新建文件,光标置于第一行首。
- vi +n filename:打开文件,光标置于指定第 n 行首。
- vi + filename:打开文件,光标置于最后一行首。
- vi +/pattern filename:打开文件,光标置于第一个匹配 pattern 的字符串处。
- vi -r filename:系统崩溃后恢复指定文件 filename 的编辑状态。
- vi filename ... filename:同时打开多个文件,依次编辑。
光标移动类命令(补充)
- h:左移一个字符
- l:右移一个字符
- space:右移一个字符
- Backspace:左移一个字符
- k 或 Ctrl+p:上移一行
- j 或 Ctrl+n:下移一行
- Enter:下移一行
- w 或 W:右移到下一个单词的起始处
- b 或 B:左移到上一个单词的起始处
- e 或 E:右移到当前单词的结束处
- ):光标移至当前句子的末尾
- (:光标移至当前句子的开头
- }:光标移至当前段落的开头
- {:光标移至当前段落的结尾
- nG:光标移至第 n 行行首
- n+:光标向下移动 n 行
- n-:光标向上移动 n 行
- n$:光标移至第 n 行行尾
- H:光标移至屏幕顶部行
- M:光标移至屏幕中间行
- L:光标移至屏幕底部行
- 0:(数字零)光标移至当前行行首
- $:光标移至当前行行尾
屏幕翻滚类命令
- Ctrl+u:向文件开头方向翻滚半屏
- Ctrl+d:向文件末尾方向翻滚半屏
- Ctrl+f:向文件末尾方向翻滚一屏
- Ctrl+b:向文件开头方向翻滚一屏
- nz:将第 n 行移至屏幕顶部(不指定 n 则默认当前行)
文本插入与替换类命令
- i:在光标前插入文本
- I:在当前行行首插入文本
- a:在光标后插入文本
- A:在当前行行尾插入文本
- o:在当前行下方新建一行并进入插入模式
- O:在当前行上方新建一行并进入插入模式
- r:替换光标处的一个字符(替换后返回命令模式)
- R:连续替换字符,直到按下 ESC 键
- s:从光标位置开始替换指定数目的字符
- S:删除指定行数并用输入内容替换
- ncw 或 nCW:修改指定数目的单词
- nCC:修改指定数目的行
删除命令(二)
- ndw 或 ndW:删除从光标开始向右的 n 个单词
- do:删除从光标到当前行首
- d$:删除从光标到当前行尾
- ndd:删除当前行及其后的 n-1 行
- x 或 X:删除一个字符(x 删除光标后字符,X 删除光标前字符)
- Ctrl+u:在插入模式下删除刚刚输入的文本
搜索与替换命令
- /pattern:从光标位置向文件末尾搜索 pattern
- ?pattern:从光标位置向文件开头搜索 pattern
- n:沿同一方向重复上一次搜索
- N:沿反方向重复上一次搜索
- :s/p1/p2/g:将当前行中所有 p1 替换为 p2
- :n1,n2s/p1/p2/g:将第 n1 至 n2 行内所有 p1 替换为 p2
- :g/p1/s//p2/g:将整个文件中所有 p1 全局替换为 p2
选项设置
- all:列出所有选项的当前设置情况
- term:设置终端类型
- ignorance:搜索时忽略大小写
- list:显示制表符(Ctrl+I)和行尾符号($)
- number:显示行号
- report:显示由行操作命令所影响的文本行数
- terse:显示简短的警告信息
- warn:切换到其他文件时若未保存当前文件则给出提示
- nomagic:允许在搜索模式中使用特殊字符而未加反斜杠转义
- nowrapscan:禁止 vi 在搜索到文件两端时自动从另一端继续
- mesg:允许 vi 显示其他用户通过 write 发送到终端的消息
最后行方式命令
- :n1,n2 co n3:将第 n1 到 n2 行的内容复制到第 n3 行下方
- :n1,n2 m n3:将第 n1 到 n2 行的内容移动到第 n3 行下方
- :n1,n2 d:删除第 n1 到 n2 行之间的内容
- :w:保存当前文件
- :e filename:打开文件 filename 进行编辑
- :x:保存当前文件并退出 vi
- :q:退出 vi
- :q!:强制退出 vi(不保存)
- :!command:执行 shell 命令 command
- :n1,n2 w!command:将第 n1 到 n2 行的内容作为命令 command 的标准输入并执行(不指定范围则使用整个文件)
- :r!command:将 shell 命令 command 的输出结果插入到当前光标行下方
寄存器操作
- "?nyy:将当前行及其下方 n 行复制到寄存器 ? 中(? 为字母,n 为数字)
- "?nyw:将当前行及其下方 n 个单词复制到寄存器 ? 中
- "?nyl:将当前行及其下方 n 个字符复制到寄存器 ? 中
- "?p:将寄存器 ? 中的内容粘贴到光标位置(? 可以是字母或数字)
- ndd:删除当前行及其下方共 n 行,并将删除内容放入 1 号删除寄存器中。
