2.2 基本编辑器vi的使用
程序的编辑离不开编辑器。Linux下的编辑器有vi、emacs、ex、nedit和gedit等,各有特点,其中,使用最为广泛的还是vi。
vi编辑器的全称是可见编辑程序(Visual Editer),取visual的前两个字母,是Linux系统中建立和编辑文件功能比较完备而又操作简单的文本编辑工具,所有的Linux平台都提供了vi。用户应该学会使用它。
vi的设计目标是用于视频显示终端,用户可以在终端的整个屏幕上移动光标,随时访问、修改整个文件的内容,使用户编辑和修改文本非常方便。
2.2.1 进入和退出vi
在使用vi编辑器时,首先应进入vi编辑程序,使终端处于vi命令模式。在此状态下执行各种vi编辑命令。此时,若需要输入文本,则还要进入输入模式。输入结束后退出输入模式回到vi命令模式。如果对文本的编辑结束,就要退出vi命令模式,回到shell提示符下。
两种编辑模式的关系如图2-1所示。
图2-1 vi中的命令模式和输入模式
1.进入vi
当要进入vi编辑器时,输入vi和想建立或编辑的文件名称,中间用空格隔开:
$ vi filename
例如,假设想建立一个名为test.txt的文件,可以输入:
$ vi test.txt
结果,屏幕将进入vi的命令模式,此时可以输入一些命令(a、A、i、I、o和O)进入输入模式.也可以执行各种编辑命令来编辑已在缓冲区中存在的文本。
从输入模式回到命令模式按【Esc】键。
2.退出vi
当完成对文本的编辑后,需要把缓冲区的内容写到文件中去,并返回到 shell下。为此,需要按两次大写的【Z】键(即【ZZ】),结果编辑程序就将缓冲区中的文本移动到它所登记的在用户进入编辑器时所指定的文件中,并在 屏幕底部的通知中给出这一文件名和文件的行数和字符数,最后退出编辑状态,回到shell提示符下。
也可以用行编辑程序中的:w和:q命令进行写文件和退出编辑器(行编辑程序命令以冒号开始,并在屏幕的底行显示)。:w把缓冲区的内容写到一个文件中,:q命令退出编辑程序回到shell下。可以单独输入这两个命令,也可以合起来当成一个命令:wq输入。
2.2.2 vi的基本编辑命令
vi的基本编辑命令主要有移动光标、输入文本、删除文本、替换文本、恢复命令和使用行编辑命令。
1.移动光标
为了编辑文本,必须把光标移到希望编辑的地方,为办到这一点,用户可以用键盘上的方向键和4个排列在一起的按键【H】、【J】、【K】和【L】进行操作,如表2-1所示。
表2-1 在vi文本中移动光标
命 令 | 操 作 |
【K】 | 把光标向上移动一行,保持光标的列位置 |
【J】 | 把光标向下移动一行,保持光标的列位置 |
【H】 | 把光标向左移动一个字符 |
【L】 | 把光标向右移动一个字符 |
光标可以从第一行到最后一行上下移动,左右移动可从每行的第一个字符到最后一个字符。
可以在这4个命令前加一个希望移动的数,这样在需要多次移动光标时不必多次按动命令键。例如,为了向左移动5个字符,可以按5次【H】键,也可以输入5h。如果在要求的方向上光标不能再移动,vi将响铃警告。
值得注意的是,和大多数vi命令一样,h、j、k和l移动命令是隐 式进行的,即输入这些命令时,这些命今并不在屏幕上显示,只有处于输入方式并把文本加到一个文件中时,才能在屏幕上看到字符。如果移动命令字符出现在屏幕 上,那么说明仍处于输入方式。为了退到命令方式,需要按【Esc】键。
2.输入文本
如果已成功地进入vi,那么已处于命令模式,此时vi正等待用户的编辑命令,下面介绍如何输入文本。
有6条基本的用于建立文本的命令,如表2-2所示。
表2-2 在vi中进入输入模式
命 令 | 操 作 |
a | 在光标的后面开始插入文本 |
A | 在光标所在行(当前行)的最后添加文本 |
i | 在光标的前面开始插入文本 |
I | 在光标所在行(当前行)的行首插入文本 |
o | 在光标所在行(当前行)的下一行从其行首开始插入文本,即将文本插入在当前行之后 |
O | 在光标所在行(当前行)的上一行从其行首开始插入文本,即将文本插入在当前行之前 |
用户可以选择其中任何一种命令来进入文本输入模式。在文本输入模式 下,可以把文本输入到文件中去,一行结束时按【Return】键,开始新的一行。当文本输入结束后,按【Esc】键就可以退出输入模式,回到命令模式。此 时可以编辑已经输入的文本,或者把缓冲区中的文本写到文件中去。
例如,当用户在编辑状态下按【A】键(【A】键是命令,不显示)时,就可以从编辑状态进入文本输入方式,输入结束后按【Esc】退出输入方式。
<a>
The quick brown fox
jumped over the lazy dog
3.删除文本
vi提供了用户删除文本的x命令和dd命令,如表2-3所示。
表2-3 vi删除文本
命 令 | 操 作 |
x | 删除光标所在的字符 |
nx | 删除包括光标在内的后n 个字符 |
dd | 删除光标所在的一行 |
ndd | 删除光标所在的后n 行 |
注:n 是要删除的数量。
4.替换文本
在文本输入结果后,如果发现有些字符或字符串不正确。可以选择表2-4中的一些编辑命令对字符或字符串进行替代。
表2-4 vi替换文本
命 令 | 操 作 |
rx | 用x替代当前光标所在字符 |
nx | 用x替代n 个字符 |
R | 代替一串字符 |
r | 用输入的字符替代当前字符 |
例如:
把句中的词acts替代成ants。
The circuit has many acts.
先把光标置于acts的字母c上,再输入:
rn
结果该句变成了:
The circuit has many ants.
为了把many改成7777,可先把光标定置于many字母的m处,再输入:
4r7
r命令把many的4个字母改为4次出现的数字7,句子就变成了:
The circuit has 7777 ants.
5.恢复命令
恢复命令用于废除最后一次发出的命令,恢复被修改或删除的内容。vi恢复命令是u和U,如表2-5所示。
表2-5 vi恢复操作
命 令 | 操 作 |
u | 废除最近的命令,恢复被修改和删除的内容 |
U | 把当前行恢复到修改之前的状态 |
6.使用行编辑命令
在vi指令模式下,还可以使用edit命令。在vi下,只要输入“:”,就可以在“:”提示符下执行编辑的一些命令。
例如:
将一文件otherfile的内容读入缓冲区中,并放在当前行之后:
:r otherfile
存盘退出:
:wq
强制退出,不存盘:
:q!
2.2.3 vi的高级编辑命令
1.在屏幕上移动光标
具体操作如表2-6所示。
表2-6 vi其他移动光标命令
命 令 | 操 作 |
H | 把光标移到屏幕的第一行 |
M | 把光标移到屏幕的中间 |
L | 把光标移到屏幕的最后一行 |
fx | 光标向右移到指定的字符x |
Fx | 光标向左移到指定的字符x |
命 令 | 操 作 |
tx | 光标向右移到指定字符x的前一个字符 |
Tx | 光标向左移到指定字符x的后一个字符 |
- | 移至上一行的行首 |
w | 移至下一个词或者标点处 |
W | 移至下一个词 |
e | 移至词尾或标点处 |
E | 移至下一个词的词尾 |
b | 移至词头或标点处 |
B | 移至词头 |
( | 移至下一句子的起始处 |
) | 移至当前句子的起始处 |
{ | 移至下一段的起始处 |
} | 移至上一段的起始处 |
]] | 移至下一节的起始处 |
[[ | 移至上一节的起始处 |
这些命令都可以带上数字前缀。
例如,5w表示向前移动5个词的单位,9e表示将光标移动到第9个单词后面。
2.搜索字符模式:/和?命令
vi提供了在命令模式下查找在缓冲区中的某一字符串的功能,这可以用最快的方法将光标移到文章的指定位置。可以向下查询,也可以向上查询,还可以查询与给定字符串相匹配的多个串。这一功能对于调试大型程序是相当有用的,具体命令如表2-7所示。
表2-7 vi查询字符串
命 令 | 操 作 |
/ | 向下搜索字符串 |
? | 向上搜索字符串 |
n | 向上重复前面的搜索 |
N | 向下重复前面的搜索 |
搜索命令是可循环搜索的。
例如,用户当前位置在缓冲区的末尾,而要搜索的字符串(用/命令)在缓冲区的顶部时,则搜索命令也可以找到这个字符串。
搜索命令不允许用数来指定模式的第几次出现。
例如,不能在“/”命令前加数字3来寻找某个字符串(在当前位置后)的第3次出现。
3.特殊命令
vi中有4条非常有用的特殊命令,如表2-8所示。
表2-8 vi的特殊命令
命 令 | 操 作 |
. | 重复上一条命令 |
J | 将两行合并为一行 |
^l | 清除屏幕再重画 |
~ | 将字符从小写变成大写,或者反之 |
l 重复上一条命令:重复上一条建立、删除和修改文本的操作是使用句号命令(.)。它也经常与搜索命令一起使用。
例如:
假设用户在United States中忘记把字母S大写,并且又不想把Chemicalstate中的s变成大写,纠正错误的一种方法是寻找字states。先找到表达式 United states,把一个小写s改成大写S,再继续搜索找到states的另一次出现,这时只要直接按【.】键即可。vi会记住上条命令,因而将重复执行,把 states的第一个s改为大写的S。
l 合并两行:J命令能将两行的内容合并为一行。在执行此命令前,先要把光标置于要合并两行的第一行上,再按【Shift+J】组合键。结果就将当前行与其下一行合并为一行。
例如,下列两行文本:
Dear Mr.
Smith:
将光标移到第一行的任意一个字符上,再输入命令:
J
就可以在屏幕上立即看到:
Dear Mr. Smith:
值得注意的是,vi自动在第一行的最后一个词和第二行的第一个词之间加进一个空格。
l 清除和重画屏幕内容:当用vi编辑时,如果有另外一个用户用write命令给你发一条消息,那么这条消息将显示在当前屏幕上,并覆盖了一部分你正在编辑的 代码。此时,如果是处于命令模式下,就可以马上读你的文本。但如果是在文本输入模式下,就需要按【Esc】键回到命令模式,然后输入 ^L(【Ctrl+L】)命令,结果vi就会抹除发给你的消息,并重新显示原屏幕的内容,使之恢复到消息没有到来以前的状态。
l 改变字母的大小写:改变字母大小写的一种快速方法是把光标置于要改写的字母上,然后按~键,其结果就是把原小写字母改成大写字母,原大写字母改成小写字母。
例如:
假设要把字母a改成A,只要把光标放在字母a上,然后按【~】键即可。也可以多次按【~】键来改变若干个字母的大小写,或者在命令前加一个数字,以便使用一条命令即可改变若干个字母。
4.插入shell命令的输出
在编辑的文件中能够插入shell命令的输出。
例如,要在文件中插入一个时间戳,让它看起来像个日记,vi可以执行一条命令并用其输出结果替换当前行。要创建一个时间戳,可以执行命令:
:r !date
把date命令的输出读入内存,相当于如下形式:
Sat Dec 1 20:18:54 CST 2007