vi可分为三种操作状态,分别是命令模式(Command mode)、插入模式(Insert mode)和底线命令模式(Last line mode),各模式的功能区分如下:
1. Comand mode:控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insert mode下,或者到Last line mode。2. Insert mode:唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comand mode。
3. Last line mode:将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等。
不过可以把vi简化成两个模式,即是将Last line mode也算入Command mode,把vi分成Command 和Insert mode。
【进入vi的命令】
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename....filename :打开多个文件,依次进行编辑
【移动光标类命令】
h :光标左移一个字符
l :光标右移一个字符
k :光标上移一行
j :光标下移一行
w :光标右移一个字至字首
b :光标左移一个字至字首
n+:光标下移n行
n-:光标上移n行
H :光标移至屏幕顶行
M :光标移至屏幕中间行
L :光标移至屏幕最后行
0:(注意是数字零)光标移至当前行首
$:光标移至当前行尾
【屏幕翻滚类命令】
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
【插入文本类命令】 Insert mode。(i=insert、a=append、o=open、r=replace)
i :在光标前
I :在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
【删除命令】
dd:删除光标所在行。[超常用]
ndd:删除当前行及其后n-1行
d0:(数字零)删至行首
d$:删至行尾
x: 删除一个字符,x删除光标后的,而X删除光标前的
nx:例如,6x 表删除光标所在位置的后面6个字符。[常用]
Ctrl+u:删除输入方式下所输入的文本
【搜索及替换命令】
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令 (n=next)
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换
【底线命令模式】
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:w :保存当前文件
:w /tmp/1.txt:保存所做的所有修改为1.txt
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出 (等同于:wq)
:q:退出vi
:q!:不保存文件并退出vi
:!command: 执行shell命令command
:r!command:将命令command的输出结果放到当前行
【寄存器操作】
yy:复制光标所在行。[超常用]
nyy:复制光标所在行往下的n行。
nyw:复制光标所在处往后的n个字word。
nyl:复制光标所在处往后的n个字符char。
p:复制单行到您想粘贴之处。(指令‘yy’与‘p’必须搭配使用)
u:假如您误操作一个指令,可以马上按u,回复到上一个操作。取消上一个操作(u=undo)
"?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
"?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。
【其他】
按冒号“:”或“/”或“?”三键的其中一键进入Last line mode。
:set nu: 输入“:set nu”后,会在文章的每一行前面列出行号。
多文件修改:vi file1 file2
yy 在文件1的光标处拷贝所在行
:n 切换到文件2 (n=next)
p 在文件2的光标所在处粘贴所拷贝的行
:N 切换回文件1