vi 编辑器
vi 是 visual editor 的缩写,是 UNIX 所提供的编辑器之一。它提供使用者一个视窗的编辑环境,在此视窗下,使用者可编辑所要的文件。
1. 模式
vi编辑器是一个小巧但功能强大的程序,vi编辑器有三种不同的模式:
插入模式——这个模式是通过在命令模式按下“i”键进入的。
命令模式——这是用户输入单键命令的模式。在其他模式中按下ESC键就可以进入命令模式。
冒号模式——从命令模式输入一个冒号(:)就可以进入这个模式。常见的冒号模式命令有:
:wq 保存且退出编辑器
:w 保存但不退出
:q 退出且不保存
:q! 强行退出vi,不保存。
:help 获取帮助
2. 命令
2.1 光标之移动
h 向左移一个字符。
J 向上移一个字符。
K 向下移一个字符。
L 向右移一个字符。
0 移至该行之首
$ 移至该行之末
^ 移至该行的第一个字符处
H 移至视窗的第一列。
M 移至视窗的中间那列。
L 移至视窗的最后一列。
G 移至该文件的最后一列。
+ 移至下一列的第一个字符处
- 移至上一列的第一个字符处
( 移至该句之首 (注一)
) 移至该句之末。
{ 移至该段落之首 (注二)
} 移至该段落之末
nG 移至该文件的第 n 列。
n+ 移至光标所在位置之后的第 n 列
n- 移至光标所在位置之前的第 n 列
ctrl+f :后翻页
ctrl+b:前翻页
视窗最下方会显示该行之行号、文件名称等,在定位错误的时候非常方便
注一:句子(sentence)在vi中是指以『!』、『.』或『?』结束的一串字。
注二:段落(paragraph)在vi中是指以空白行隔开的文字。
2.2 插入与替换
i 在当前光标处插入, I 行首插入
a 在当前光标后追加,A 在行末追加
o 在当前行下插入一行,O在当前行上插入一行
r 替换当前光标处字符,R从光标处开始替换直到ESC键为止
s 删除光标所在之字符,并进入输入模式直到ESC键
S 删除光标所在之该行资料,并进入输入模式直到ESC键
cc 修改整行的内容,即在删除该行内容的同时保留该行并进入插入模式
注:在插入模式下可用Enter键换行
2.3 删除命令
x 删除光标处字符
X 删除光标所在之前一字符
D 以行为单位,删除光标后之所有字符
dd 删除当前行
d0 删除光标前半行
d$ 删除光标后半行
J 将下一行连结至该行末尾
2.4 剪切与复制
剪切一行
在该行执行 dd
光标移至目的地
执行 p
复制一行
在该行执行 yy
光标移至目的地
执行 p
2.5 指令重复
在指令模式中,可在指令前面加入一数字 n,则此指令动作会重复执行 n次
例:
删除10行 10dd
复制10行 10yy
光标下移10行 10j
2.6 取消(Undo)
u 恢复最后一个指令之前的结果
U 恢复光标该行之所有改变
2.7 查找
在vi中可查找某一字串s,使光标移至该处
/s 在光标之后查找该字串
?s 在光标之前查找该字串
注:查找命令是在命令模式下输入的,按Enter键后开始查找,类似于在冒号模式下输入命令
n 往下继续查找下一个相同的字串
N 往上继续查找下一个相同的字串
3 指令
以下指令都在冒号模式下输入
3.1 编辑环境的设定
:set nu 设定行号。
:set nonu 取消行号设定
:set ai 自动内缩
:set noai 取消自动内缩
自动内缩(automatic indentation):写过程序的人都知道,为了提高程序的可读性,我们需要根据程序的层次在各行代码前面添加一些空格或者tab键,像VS 6.0,VS2008等开发工具均提供了自动排版的功能。以上命令可帮助我们在vi编辑器中设置自动内缩的功能。
例如:
在插入模式下输入:
#include<stdio.h>
int main()
{
《tab》int i;
//:set nu(在冒号模式下设置自动内缩)
当敲入以上程序后,我们在冒号模式下设置自动内缩,那么以后每当我们敲Enter键换行时,新的一行前面就会自动添加一个tab键
3.2 读写资料
:w 将缓冲区的资料写入磁盘中
:10,20w test 将第10行至第20行的资料写入test文件
:10,20w>>test 将第10行至第20行的资料加在test文件之后
:r test 将test文件的资料读入编辑缓冲区的最后
3.3 删除、复制及移动
:10,20d 删除第10行至第20行的资料
:10d 删除第10行的资料
:%d 删除整个编辑缓冲区
:10,20co30 将第10行至第20行的资料复制至第30行之后
:10,20mo30 将第10行至第20行的资料移动至第30行之后
3.4 字串搜寻与替换
s(substitute)指令可搜寻某行列范围,g(global)指令则可搜寻整个编辑缓冲区的资料
s指令以第一个满足该条件的字串为其替换的对象,若该行有数个满足该条件的字串,也仅能取代第一个,若想取代所有的字串则需加上g参数
:s/int/void 在当前行搜索int字串,若找到则替换为void
:1,$s/old/new/g 将文件中所有的『old』替换成『new』
:10,20s/^/ / 将第10行至第20行资料的最前面插入1个空白
:%s/old/new/g 将编辑缓冲区中所有的『old』替换成『new』
4. 系统
4.1 恢复编辑时被中断的文件
在编辑过程中,若系统当掉或连线中断,而缓冲区的资料并还未被写回磁盘时,当再度回到系统,执行下列指令即可回复中断前的文件内容。
vi -r filename
4.2 编辑多个文件
vi亦提供同时编辑多个文件的功能,方法如下:
vi file1 file2 …
当第一个文件编修完成后,可利用『:w』将该缓冲区存档,而后再利用 『:n』载入下一个文件
5. 一个简单的C程序实例
1) 在系统提示符($)下输入命令vi和想要编辑(建立)的文件名
vi test.c <enter>
此刻屏幕上会出现 vi 的编辑视窗,同时 vi 会将文件复制一份至记忆体中的缓冲区 (buffer), vi会保留在磁盘中的文件不变,而先对缓冲区的文件作编辑,编辑完成后,使用者可决定是否要取代原来旧有的文件
2) 按键I进入插入模式。屏幕上看不到字符i,屏幕下方出现--INSERT--字样。
3) 输入你的程序:
#include<stdio.h>
int main()
{
printf("Hello World/n");
return 0;
}
4) 按〈Esc〉键,从插入模式进入冒号模式。
5) 输入wq,保存退出
6) 在系统提示符($)下输入命令编译连接程序
cc -o test test.c
此时在当前目录下就生成了一个名为test的可执行文件,可用ls -l 命令查看
7)在系统提示符($)下输入命令
./test
程序执行,在屏幕打印:Hello World
注:以上命令均在Sun VirtualBox中的Ubuntu OS下验证过