Vi 有三种模式,输入模式(Inserting Mode)、指令模式(Command Mode)以及ex模式(Ex Mode)。在输入模式下可以输入文字,而指令模式下可以执行编辑文件、存档等等指令;Ex
式用于执行另外一些功能,如查找、替换文本、多文件的操作等等。 要进入vi可以直接在Shell提示符下键入vi [文件名称],如果该文件在当前目录不存在,则vi创建之。
为了进入输入模式,有好几种方法:

新增 (append)
a
从光标所在位置后面开始添加内容,光标后的内容随新增字符向后移动。
A
从光标所在列最后面的地方开始添加内容。

插入 (insert)
i
从光标所在位置前面开始插入内容,光标后的内容随新增内容向后移动。
I:
从光标所在列的第一个非空白字符前面开始插入内容。

开始 (open)
o
在光标所在列下新增一列并进入输入模式。
O
在光标所在列上方新增一列并进入输入模式。

可以随时用ESC键切换到指令模式,连续按一两次就够了,这时系统会发出哔哔声以确定进入指令模式。然后再指令模式下有多种退出方法:
ZZ
保存并退出

:x
保存并退出

:wq
保存并退出

:w
保存并返回指令模式

:30,60w [
新文件] 3060行的内容写入[新文件]

:30,60w>> [
文件] 将第3060行的内容写入[文件]的末尾

:q 退出

:q!
退出并丢掉所有未保存信息

Q
退出vi,激活ex

:e file2
在不离开vi的条件下编辑file2

:n
编辑下一个文件

:e!
回到当前编辑文件上次保存的状态


Vi
基本编辑

【移动光标】

移动光标自然是编辑过程中的基本技能,这个步骤一定要熟练掌握。

常用的移动命令键有:

h
左移一个字符

j
下移一行

k
上移一行

l
右移一个字符

w,W
跳至后一个字(W忽略标点)

b,B
跳至前一个字(B忽略标点)

$
至行尾

^
至本行第一个非空字符

0
至行首

G
至缓冲区的起始处

nG n
是整数,至第n

CTRL-d
向下半页

CTRL-u 向上半页

CTRL-f
向下一页

CTRL-b
向上一页

H
移动到当前窗口的第一列

M
移动到当前窗口的中间列

L
移动到视窗的最后列

e
移动到下个字的最后一个字母

n-
减号移动到上一列的第一个非空白字符,前面加上数字可以指定移动到以 n

n+
加号移动到下一列的第一个非空白字符,前面加上数字可以指定移动到以下 n

fx
往右移动到 x 字符上

Fx
往左移动到 x 字符上

tx
往右移动到 x 字符前

Tx
往左移动到 x 字符前

;
配合 f t 使用,重复一次

,
配合 f t 使用,反方向重复一次


【编辑】

x
删除光标所在字符,同时所在行的位于光标后的文字一起左移一格;如果删除的是某行的最后一个字符,则删除后光标左移一格

d
是删除命令,它作用于文本对象,即可被移动命令跨过的文本块。例如w可以用来跳至下一个字开始处,那么dw从光标位置所在字删至下一字开始处;6w将删至光标所在字后第六个字开始处等等

dd
删除光标所在的行

r
修改光标所在字符,r 后接着要修改的字符

R
进入取代状态,新增内容会覆盖原先内容,直到按 [ESC] 回到指令模式下止

s
删除光标所在字符,并进入输入模式

S
删除光标所在的列,并进入输入模式

u
撤消最近一次对文本的改动。标准版的vi只能执行一级撤消,而vim则可以多级

U
行撤消命令,用来撤消从光标最近一次移到该行时起对光标所在行做的全部改动

n(
左括号移动到句子的最前面,前面加上数字可以指定往前移动 n 个句子.句子以! . ? 三种符号来界定

n)
右括号移动到下个句子的最前面,前面加上数字可以指定往后移动 n 个句子

n{
左括弧移动到段落的最前面,前面加上数字可以指定往前移动 n 个段落。段落以段落间的空白列界定

n}
右括弧移动到下个段落的最前面,前面加上数字可以指定往后移动 n 个段落


看到这里,恐怕有的读者已经开始吐舌头了:这么多"莫名其妙"的指令来编辑文本实在是太复杂了!还是那句话,"熟能生巧"。如果用的熟练了,利用这些命令来移动、编辑简直都不是大脑在控制,你的手指已经足够熟练为你做好任何你想做的事情


【指令组成】

现在可以提一下vi的指令组成。上面也看到了,很多指令都是控制键和数字等结合起来控制的。没错!其中很多大致是由指令与范围所构成。例如 dw 是由删除指 d 与范围 w 所组

成,代表删除一个字 d(elete) w(ord)

指令列表有:

d
删除(delete)

y
复制(yank)

p
放置(put)

c
修改(change)

范围可以是下列几个:

e
光标所在位置到该字的最后一个字母

w
光标所在位置到下个字的第一个字母

b
光标所在位置到上个字的第一个字母

$
光标所在位置到该列的最后一个字母

0
光标所在位置到该列的第一个字母

)
光标所在位置到下个句子的第一个字母

(
光标所在位置到该句子的第一个字母

)
光标所在位置到该段落的最后一个字母

{
光标所在位置到该段落的第一个字母

其实组合命令远远不止这些,更多的需要在实践中慢慢体会。


【查找样本】

在文本内移动的时候经常需要查找一定模式(Pattern)构成的文本,vi也提供了相应的命令键

/pattern
移至下一个包含pattern的行

?pattern
移至上一个包含pattern的行

/
往下重复查找

?
往上重复查找

n
在同一方向重复查找

N
在相反方向重复查找

/pattern/+n
移至下一个pattern所在行后的第n

?pattern?-n
移至上一个Pattern所在行前的第n

/pattern/z-
重绘屏幕,使下一个包含pattern的行位于屏幕的最底行

%
移至与光标所在的括弧匹配成对的圆括弧或大括弧


【标记文本】

也可以将某段文本标记起来,方便以后跳转

mchar
用字母char标记当前光标的位置

`char
移至char所标记处

'char
移至char标记所在行的开头处

"
移至当前行上一次所在位置(在光标移动之后)――一个双引号

''
移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号