Vi 简介
文本编辑大概是系统运行中最为频繁的操作了,而在Linux下有一种标准而功能极为强大的编辑器,那就是Vi(Visual Edtior)。
对于Linux的初学者来说,vi可能显得极为不友好――所有操作都要用特殊的击键或者组合键来控制,而且似乎这些命令跟要执行的操作并没有什么关系,非常难记,比起Windows下的notepad实在是"恐怖"多了。其实这只是转移工作环境中的正常现象,如果经过大量的实践,你会发现其实vi对于键盘的利用非常合理,如果用的熟练了,vi不仅可以成为你的文本编辑利器,而且对于系统配置甚至编程都有莫大的帮助。
Vi实用操作指南
作为一个Unix系统下标准的全屏幕文本编辑器,vi可以方便的实现插入、修改、拷贝粘贴三种基本的编辑操作。但是不像其他的字处理器,vi是以指令模式作为缺省的模式运行的。
更复杂的操作可以用一系列的按键来完成。
基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
1) 命令行模式command mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。
2) 插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。
3) 底行模式(last line mode)
将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。
不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
打开文件
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename....filename :打开多个文件,依次进行编辑
关闭文件
可以随时用ESC键切换到指令模式,连续按一两次就够了,这时系统会发出哔哔声以确定进入指令模式。然后再指令模式下有多种退出方法:
ZZ 保存并退出
:x 保存并退出
:wq 保存并退出
:w 保存并返回指令模式
:30,60w [新文件] 将30到60行的内容写入[新文件]
:30,60w>> [文件] 将第30到60行的内容写入[文件]的末尾
:w %.new 将当前缓冲区中的内容写入file.new中,File是当前编辑的文件名
:q 退出
:q! 退出并丢掉所有未保存信息
Q 退出vi,激活ex
:e file2 在不离开vi的条件下编辑file2
:n 编辑下一个文件
:e! 回到当前编辑文件上次保存的状态
移动光标
移动光标自然是编辑过程中的基本技能,这个步骤一定要熟练掌握。
1.逐字符移动
h 左移一个字符
j 下移一行
k 上移一行
l 右移一个字符
2.逐单词移动
w,W 跳至后一个单词词首(W忽略标点)
b,B 跳至前一个单词词首(B忽略标点)
e 跳至当前或下一个单词的词尾
3.行内跳转
$ 至行尾
^ 至本行第一个非空字符
0 至行首
4. 行间跳转
G 至缓冲区的起始处
nG n是整数,至第n行
gg 跳转到文件头
GG 跳转到文件尾
翻屏
CTRL-d 向下半页
CTRL-f 向下一页
CTRL-u 向上半页
CTRL-b 向上一页
H 移动到当前窗口的第一列
M 移动到当前窗口的中间列
L 移动到视窗的最后列 │
删除、复制、粘贴、修改
很多指令都是控制键和数字等结合起来控制的。没错!其中很多大致是由指令与范围所构成。
例如 dw 是由删除指 d 与范围w 所组成,代表删除一个字 d(elete) w(ord) 。
指令列表有:
d 删除(delete) 剪切
y 复制(yank)
p 放置(put)
c 修改(change)
范围可以是下列几个:
e 光标所在位置到该字的最后一个字母
w 光标所在位置到下个字的第一个字母
b 光标所在位置到上个字的第一个字母
$ 光标所在位置到该列的最后一个字母
0 光标所在位置到该列的第一个字母
) 光标所在位置到下个句子的第一个字母
( 光标所在位置到该句子的第一个字母
) 光标所在位置到该段落的最后一个字母
{ 光标所在位置到该段落的第一个字母
其实组合命令远远不止这些,更多的需要在实践中慢慢体会。
插入文本类命令
i: 在光标前
I: 在当前行首
a: 光标后
A: 在当前行尾
o: 在当前行之下新开一行
O: 在当前行之上新开一行
r: 替换当前字符
R: 替换当前字符及其后的字符,直至按ESC键
s: 从当前光标位置处开始,以输入的文本替代指定数目的字符
S: 删除指定数目的行,并以所输入文本代替之
ncw或nCW: 修改指定数目的字
nCC: 修改指定数目的行
替换
r 替换光标所在字符
R 进入替换模式,直到按下ESC键
撤销编辑操作
u
#u
可视化模式
v:按字符选取
V:按矩形选取
搜索及替换命令
/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替换
s/vivian/sky/
# 替换当前行第一个 vivian 为 sky s/vivian/sky/g
# 替换当前行所有 vivian 为 sky n,$s/vivian/sky/
# 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky n,$s/vivian/sky/g
# 替换第 n 行开始到最后一行中每一行所有 vivian 为sky %s/vivian/sky/g
# (等同于 g/vivian/s//sky/) 替换每一行的每一个 vivian 为 sky s#vivian/#sky/#
# 替换当前行第一个 vivian/ 为 sky/(可以使用 #或+作为分隔符,此时中间出现的 / 不会作为分隔符) s/p1/p2/g
# 将当前行中所有p1均用p2替代 n1,n2s/p1/p2/g
# 将第n1至n2行中所有p1均用p2替代 g/p1/s//p2/g
# 将文件中所有p1均用p2替换