软件教程 文本编辑器Vi用法浅说   系统篇 软件篇 技巧篇 Linux man篇

    前言
    用于编辑文本文件(比如信件、C++源代码或者是系统配置文件)的文本编辑器相信所有用家都会有机会接触到。好似DOS年代的EDIT、Windows 9X上的记事本,相信都给各位留下了非常深刻的印像。
    而在Unix的世界中,使用最为普遍的编辑器当属vi无疑,可以说有Unix的地方就会有提供这套软件,Linux当然也不例外。虽然今日Unix系统上已经发展出许多更易使用、功能更为强大的文本编辑器,但仅就通用性而言,学习vi的基本操作还是很有益处的,至少能够让你在各个不同的机器上得心应手。

    一、vi的基本概念
    vi是英文“Visual editor”的缩写,作为一个建立和编辑文件的有力工具,其设计目标是用于终端机荧屏,也就是说可以立刻在荧屏上看到操作结果。
    vi有三种操作模式,可以分别称为指令模式、插入模式和指令行模式。
    当执行vi后,会先进入指令模式。此时输入的任何字元都被视为指令,用家可以用之对文本进行编辑或者切换到其它模式。
    而插入模式是用家大多数时候所处的工作模式。此时可以从当前光标所在位置方便地插入正文。按Esc键可以切换到指令模式。
    指令行模式用以向vi输入特定的扩充指令。在指令模式中键入“:”就可以切换至指令行模式,在指令行模式中,用家输入的单行指令会显示在荧屏的最底行,按“Enter”键后才会确认执行。

    二、启动vi
    要进入vi可以直接在系统提示符下键入如下命令:
    vi <档案名称>
    vi可以自动帮你载入所要编辑的档案或是开启一个新档。当你开启一个新档时,荧屏左方会出现波浪符号“~”,行首带有这个符号的行尽管有在荧屏中显示,其实并不是文件的一部分。荧屏底下会显示当前编辑文本的档案名称。此时vi处于指令模式,你可以通过键入指令“i”切换到插入模式,更多的指令可以参考下一节的内容。(图1)

    三、插入模式
    vi刚启动的时候,一般是处于指令模式的,用家可以利用以下这些指令切换到插入模式中:
新增(append)
a 从当前光标所在位置之后插入正文。
A 从当前光标所在列最后面的地方插入正文。

插入(insert)
i 从当前光标所在位置之前插入正文。
I 从当前光标所在列的第一个非空白字符之前插入正文。

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

    用家亦可以用下面这行指令插入其它文件的正文到当前光标所在的位置:
    :r <旧档案名称>
    或者用以下指令将shell命令执行后的结果插入光标所在的位置:
    :r [shell命令]
    例如,在指令模式中键入“:r ls -a”,用家将得到如图的结果。(图2)

    四、基本编辑
    配合一般键盘上的功能键,像是“Insert”、“Delete”以及方向键等,现在你应该已经可以利用vi来处理文字资料了。除此以外,vi还提供了许多让文字处理更显方便的指令。

    删除与修改
    在vi的原始观念里,输入跟编辑完全是两回事。编辑是在指令模式下操作的,先利用指令移动光标来定位要进行编辑的地方,然后才下指令做编辑。
x 删除光标所在字符。
dd 删除光标所在的行。
r 修改光标所在字符,r后接着要插入修正的字符。
R 进入取代状态,新增资料会覆盖原来的资料,直到按“Esc”回到指令模式下为止。
s 删除光标所在字符,并进入插入模式。
S 删除光标所在的行,并进入插入模式。

    移动光标
    由于许多编辑工作是藉由光标定位来完成的,所以vi提供了许多移动光标的指令。在指令模式下移动光标的基本指令是h,j,k,l。PC键盘上的方键键也可以起到同样的作用,而且无论在指令模式或输入模式下都可以应用,这可算是PC键盘为用家提供的便利之处了。其他一些用来移动光标的命令还有:
H 移动到荧屏的第一行。
M 移动到荧屏的中间行。
L 移动到荧屏的最后一行。
G 移动到文档的最后一行。
b 移动到下一个单词的第一个字母。
w 移动到上一个单词的第一个字母。
e 移动到下一个单词的最后一个字母。
0 移动到当前行的第一个字符,其功能等同按“Home”键。
$ 移动到当前行的最后一个字符,其功能等同按“End”键。
^ 移动到光标所在行的第一个非空白字符。
n- 减号移动到上一列的第一个非空白字元,前面加上数字可以指定往上移动n行。
n+ 加号移动到下一列的第一个非空白字元,前面加上数字可以指定往下移动n行。
nG 移动到第n行。
fx 往右移动到x字符上。
Fx 往左移动到x字符上。
tx 往右移动到x字符前。
Tx 往左移动到x字符前。
; 配合上述f和t指令使用,重复一次。
, 配合上述f和t指令使用,反方向重复一次。
/string    往右移动到有string的地方。
?string    往左移动到有string的地方。
n 配合上述/和?指令使用,重复一次。
N 配合上述/和?指令使用,反方向重复一次。
n( 左括号移动到句子的最前面,前面加上数字可以指定往前移动n个句子。(句子是以!.?三种符号来界定)
n) 右括号移动到下个句子的最前面,前面加上数字可以指定往后移动n个句子。
n{ 左括弧移动到段落的最前面,前面加上数字可以指定往前移动n个段落。
n} 右括弧移动到下个段落的最前面,前面加上数字可以指定往后移动n个段落。
Ctrl-u     向上滚屏半页。
Ctrl-b    向上滚屏一页,其功能等同按“PageUp”键。
Ctrl-d    向下滚屏半页。
Ctrl-f    向下滚屏一页,其功能等同按“PageDown”键。
    比较起来,在Windows上使用的文本编辑器就远没有这么麻烦,输入和编辑都可以在输入模式下完成。不必去用什么指令模式的编辑指令。不过正如前面所提到的,这些指令几乎是在每台终端机上都能用,而不是仅仅在PC上,用家如肯努力加以实操肯定会获益弗浅的。

    五、进阶编辑指令
    熟悉并掌握上述指令以后,想必各位用家会对vi有更深的认识,在处理文字上也不会有什么麻烦了。在这里再介绍一些vi的进阶编辑指令以便用家可以进一步简化操作过程。
这些编辑指令非常有弹性,基本上可以说是由指令与范围所构成。例如dw是由删除指令d与范围w所组成,代表删除一个字d(elete) w(ord)。

指令列表如下:
d 删除(delete)
y 复制(yank)
p 放置(put)
c 修改(change)

范围可以是下列几个:
e 光标所在位置到该字的最后一个字母
w 光标所在位置到下个字的第一个字母
b 光标所在位置到上个字的第一个字母
$ 光标所在位置到该列的最後一个字母
0 光标所在位置到该列的第一个字母
) 光标所在位置到下个句子的第一个字母
( 光标所在位置到该句子的第一个字母
} 光标所在位置到该段落的最后一个字母
{ 光标所在位置到该段落的第一个字母

    值得注意的一点是删除与复制都会将指定范围的内容放到缓存区里,然后就可以用指令p贴到其它地方去,这是vi用来处理区段拷贝与搬移的办法。
    对于整列操作,vi另外提供了更方便的编辑指令。前面曾经提到过删除整行文字的指令dd就是其中一个;cc可以修改整行文字;而yy则是复制整行文字;指令D就可以删除光标到该行结束为止所有的文字。
    某些vi版本,例如Linux所用的elvis可以大幅简化这一堆指令。如果稍微观察一下这些编辑指令就会发现问题其实是定范围的方式有点杂乱,实际上只有四个指令罢了。指令v非常好用,只要按下v键,光标所在的位置就会反白,然后就可以移动光标来设定范围,接着再直接下指令进行编辑即可。

    六、保存文件并退出vi
:q        结束编辑,退出vi。如果当前文档已经修改而又没有存盘的话将会返回错误信息。
:q!         不保存对文档所作的修改,强制退出vi。
:n,mw filename    将第n行到第m行的文字存放的所指定的filename里去。
:w <filename>    保存档案。
:wq        保存档案并退出vi。
ZZ         存档后退出vi。注意这是在指令模式下使用的指令。

Copyright © 1999 《Best Linux》. All rights reserved. Revised: 99-11-28.