vi 编辑器,作为 Unix/Linux 系统中几乎等同于“编辑器”代名词的经典工具,其命令行操作虽然初看有些陡峭,但一旦熟练掌握,带来的效率提升绝非一星半点。以下这份清单,将 vi 的常用命令按照功能分门别类地整理出来,覆盖了从文件打开、光标移动、文本编辑到搜索替换、寄存器操作等各个方面。日常记不住命令时随手翻阅这部分内容,基本就能满足多数场景的需求。
进入 vi 的命令
vi filename:打开或新建文件,并将光标置于第一行首
vi +n filename:打开文件,并将光标置于第 n 行首
vi + filename:打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与 pattern 匹配的字符串处
vi -r filename:当上次使用 vi 编辑时系统发生崩溃,用此命令恢复 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-1 个单词
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:在切换到其他文件时,若未保存当前文件则显示 NO write 提示信息
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 的输入并执行,若不指定 n1,n2,则将整个文件内容作为 command 的输入
:r!command:将命令 command 的输出结果插入到当前行下方
寄存器操作
"?nyy:将当前行及其下方的 n 行内容保存到寄存器 ? 中,其中 ? 为一个字母,n 为一个数字
"?nyw:将当前行及其下方的 n 个单词保存到寄存器 ? 中,其中 ? 为一个字母,n 为一个数字
"?nyl:将当前行及其下方的 n 个字符保存到寄存器 ? 中,其中 ? 为一个字母,n 为一个数字
"?p:取出寄存器 ? 中的内容,并将其粘贴到当前光标位置处。这里的 ? 可以是一个字母,也可以是一个数字
ndd:将当前行及其下方的共 n 行文本删除,并将所删内容放入 1 号删除寄存器中
