vi(Visual)是以视觉为导向的全屏幕编辑器、共分为三种方式(mode):
command方式:任何输入都会作为编辑命令,而不会出现在屏幕上,若输入错误则有"岬"的声音;任何输入都引起立即反映
insert方式: 任何输入的数据都置于编辑寄存器。在command方式下输入(i,a,o等),可进入insert方式,insert方式下按ESC,可跳回command方式。
escape方式: 以":"或者"/"为前导的指令,出现在屏幕的最下一行,任何输入都被当成特别指令。
进入vi(在系统提示符下面输入以下指令):
vi filename | 打开或新建文件,并将光标置于第一行首 |
vi +n filename | 打开文件,并将光标置于第n行首 |
vi + filename | 打开文件,并将光标置于最后一行首 |
vi +/pattern filename | 打开文件,并将光标置于第一个与pattern匹配的串处 |
vi -r filename | 在上次正用vi编辑时发生系统崩溃,恢复filename |
vi filename….filename | 打开多个文件,依次进行编辑 |
编辑数个文件(利用vi filename(s))进入vi后):
:args | 显示编辑名单中的各个文件名 |
:n | 读入编辑名单中的下一个文件 |
:rew | 读入编辑名单中的第一个文件 |
:e# | 读入编辑名单内的前一个文件 |
:e file | 读入另一个文件进vi(此文件可不在编辑名单内),若原文件经修改还没有存档,则应先以: w 存档。 |
:e! file | 强迫读入另一个文件进入vi,原文件不作存档动作。 |
存储及退出vi:
:w filename | 存入指定文件,但未退出vi(若未指定文件名则为当工作的文件名)。 |
:wq 或者 :x或者zz | 保存文件,并且退出vi. |
:q | 不作任何修改并退出vi。 |
:q! | 放弃任何修改并退出vi。 |
:!command | 暂时退出vi并执行shell指令,执行完毕后再回到vi。 |
:sh | 暂时退出vi到系统下,结束时按Ctrl + d则回到vi。 |
移动光标类命令
0 | (注意是数字零)光标移至当前行首 |
$ | 光标移至当前行尾 |
h | 光标左移一个字符 |
l | 光标右移一个字符 |
k或Ctrl+p | 光标上移一行 |
j或Ctrl+n | 光标下移一行 |
nh | 光标往左移n位 |
nl | 光标往右移n位 |
nk | 光标往上移n位 |
nj | 光标往下移n位 |
space | 光标右移一个字符 |
Backspace | 光标左移一个字符 |
Enter | 光标下移一行 |
w或W | 光标右移一个字至字首 |
b或B | 光标左移一个字至字首 |
e或E | 光标右移一个字至字尾 |
) | 光标移至句尾 |
( | 光标移至句首 |
} | 光标移至段落开头 |
{ | 光标移至段落结尾 |
[ | 移到文件开始位置 |
] | 移到文件结束位置 |
n+ | 光标下移n行 |
n- | 光标上移n行 |
n$ | 光标移至第n行尾 |
nG | 光标移至第n行首 |
G$ | 移到文件的最后一个字符 |
1G或者gg | 移到文件的第一行 |
n| | 移动到当前行的第n列 |
^ | 移动到当前行的第一个非空字符 |
屏幕翻滚类命令
Ctrl+u | 向文件首翻半屏 |
Ctrl+d | 向文件尾翻半屏 |
Ctrl+f | 向文件尾翻一屏 |
Ctrl+b | 向文件首翻一屏 |
nz | 将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。 |
Vi光标放置与屏幕调整
H | 将光标移动到屏幕的顶行 |
nH | 将光标移动到屏幕顶行下的第n行 |
M | 将光标移动到屏幕的中间 |
L | 将光标移动到屏幕的底行 |
Nl | 将光标移动到屏幕的底行上的第n行 |
^e | 将屏幕上滚一行 |
^y | 将屏幕下滚一行 |
^u | 将屏幕上滚半页 |
^d | 将屏幕下滚半页 |
^b | 将屏幕上滚一页 |
^f | 将屏幕下滚一页 |
^l | 重绘屏幕 |
z-return | 将当前行置为屏幕的顶行 |
nz-return | 将当前行下的n行置为屏幕的顶行 |
将当前行置为屏幕的中央 | |
将当前行上的第n行置为屏幕的中央 | |
z- | 将当前行置为屏幕的底行 |
nz- | 将当前行上的第n行置为屏幕的底行 |
插入文本类命令
i | 在光标前 |
I | 在当前行首 |
a | 光标后 |
A | 在当前行尾 |
o | 在当前行之下新开一行 |
O | 在当前行之上新开一行 |
r | 替换当前字符 |
R | 替换当前字符及其后的字符,直至按ESC键 |
s | 从当前光标位置处开始,以输入的文本替代指定数目的字符 |
S | 删除指定数目的行,并以所输入文本代替之 |
ncw或nCW | 修改指定数目的字 |
nCC | 修改指定数目的行 |
!command | 执行shell指令,并把结果加在光标所在行的下一行。 |
删除命令
x | 删除光标处的字符,可以在x前加上需要删除的字符数目 |
X | 删除光标前的字符,可以在X前加上需要删除的字符数目 |
nx | 删除由光标位置起始的n个字符(含光标位置,按一个x表示删除光标所在的字符) |
dw | 删至下一个字的开头,即删除一个单词。 |
nX | 删除由光标位置起始的n个字符(不含光标位置)。 |
ndw | 删除光标位置其实的n个字符组(word)。 |
d0 | 将行的开始到光标位置的字符全部删除。 |
d$ 或D | 将光标位置起始到行尾的字符全部删除。 |
ndd | 将光标位置起始的n行(整行)删除(dd表示删除光标所在行)。 |
:start,endd | 删除文件的第start到end行。 |
dG | 删除行,直到文件结束 |
dd | 删除整行 |
ndd | 从当前行开始往后删除n行 |
db | 删除光标前面的字 |
ndb | 从当前行开始往前删除n行 |
:m,md | 从第m行开始删除n行 |
d或d$ | 从光标处删至行尾 |
dcursor_command | 删除至光标命令处,如dG将从当前行删除至文件的末尾 |
^h或backspace | 插入时,删除前面的字符 |
^w | 插入时,删除前面的字 |
Ctrl+u | 删除输入方式下所输入的文本 |
Vi修改文本命令
new | 更改n组字符,结束时按ESC键 |
ncc | 从光标所在位置开始更改n行,结束时按ESC键 |
rchar | 用char替换当前字符 |
R text escape | 用text替换当前字符直到按下Esc键 |
stext escape | 用text代替当前字符 |
S或cctext escape | 用text代替整行 |
cwtext escape | 将当前字改为text |
Ctext escape | 将当前行余下的改为text |
cG escape | 修改至文件的末尾 |
ccursor_cmd text escape | 从当前位置处到光标命令位置处都改为text |
搜索及替换命令
/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替换 |
Vi查找命令
/text | 在文件中向前查找text |
?text | 在文件中向后查找text |
n | 在同一方向重复查找 |
N | 在相反方向重复查找 |
ftext | 在当前行向前查找text |
Ftext | 在当前行向后查找text |
ttext | 在当前行向前查找text,并将光标定位在text的第一个字符 |
Ttext | 在当前行向后查找text,并将光标定位在text的第一个字符 |
:set ic | 查找时忽略大小 |
:set noic | 查找时对大小写敏感 |
:s/oldtext/newtext | 用newtext替换oldtext |
:m,ns/oldtext/newtext | 在m行通过n,用newtext替换oldtext,&重复最后的:s命令 |
:g/text1/s/text2/text3 | 查找包含text1的行,用text3替换text2 |
:g/text/command | 在所有包含text的行运行command所表示的命令 |
:v/text/command | 在所有不包含text的行运行command所表示的命令 |
:g/text/p | 查找所有包含text的行 |
:g/text/d | 删除所有包含text的行 |
:m,ng/text/nu | 从m行到n行查找text的行并且打印行号 |
:g | 是在所有包含需要查找的文本的行上运行一个命令 |
:v | 是在所有不包含指定文本的行上运行一个命令 |
Vi在文本中定位段落和放置标记
{ | 在第一列插入{来定义一个段落 |
[[ | 回到段落的开头处 |
]] | 向前移动到下一个段落的开头处 |
m(a-z) | 用一个字母标记当前位置,如用mz表示标记z |
'(a-z) | 将光标移动到指定的标记,如用'z表示移动到z |
复制及移动文件
:first,last co dest | 将first 到last行的数据复制到目标行(dest)下面 |
:Start,endm dest | 将start 到 end行的数据移动到目标行(dest)下。 |
:r filename | 将指定文件的内容读入光标所在行下。 |
nY | 将光标所在位置开始的n行数据暂存 |
yy | 将当前行的内容放入临时缓冲区 |
nyy | 将n行的内容放入临时缓冲区 |
p | 将临时缓冲区中的文本放入光标后 |
P | 将临时缓冲区中的文本放入光标前 |
“(a-z)nyy | 复制n行放入名字为圆括号内的可命名缓冲区,省略n表示当前行 |
“(a-z)ndd | 删除n行放入名字为圆括号内的可命名缓冲区,省略n表示当前行 |
“(a-z)p | 将名字为圆括号内的可命名缓冲区的内容放入当前行后 |
"(a-z)P | 将名字为圆括号内的可命名缓冲区的内容放入当前行前 |
Vi中的shell转义命令
:! | command 执行shell的command命令,如:!ls |
:!! | 执行前一个shell命令 |
:r! | command 读取command命令的输出并插入,如:r!ls会先执行ls,然后读入内容 |
:w! | command 将当前已编辑文件作为command命令的标准输入并执行command命令,如:w! grep all |
:cd | directory 将当前工作目录更改为directory所表示的目录 |
:sh | 将启动一个子shell,使用^d返回vi |
:so file | 在shell程序file中读入和执行命令 |
选项设置
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进行编辑 |
:!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号删除寄存器中。 |
其他命令
. | 重复前一指令 |
u | 取消前一指令 |
Ctrl + l | 刷新屏幕显示 |
:set number | 显示文件的行号,但不会存文件 |
:set nonumber | 解除行号显示 |
:set ai | 设置每行起始位置(以光标当前位置为起始) |
:set noai | 取消行起始位置设定 |
:f 或 | 告诉用户有关现行编辑文件的数据。 |
:set all | 打印所有选项 |
:set nooption | 关闭option选项 |
:set nu | 每行前打印行号 |
:set showmode | 显示是输入模式还是替换模式 |
:set noic | 查找时忽略大小写 |
:set list | 显示制表符(^|)和行尾符号($) |
:set ts=4 | 为文本输入设置tab stops |
:set window=n | 设置文本窗口显示n行 |
:.= | 打印当前行的行号 |
:= | 打印文件中的行数 |
^g | 显示文件名、当前行的行号、文件的总行数和文件位置的百分比 |
:l | 使用字母“l”来显示许多的特殊字符,如制表符和换行符 |