linux是一种文本驱动的操作系统。用户在使用linux过程中经常需要编辑文本,如编写脚本文件来执行几条命令行,写电子邮件,创建C语言源程序等。因此,必须熟悉至少一种文本编辑器以便高效的输入和修改文本文件。此外,文本编辑器还可以方便地查看文件内容,以便识别其关键特征。

linux提供了一个完整的编辑器家族系列,如Ed、Ex、vi和Emacs等,按功能可以将其分为两大类:行编辑器(Ed、Ex)和全屏编辑器(vi、Emacs)。行编辑器每次只能对一行进行操作,使用起来很不方便。而全屏编辑器可以对整个屏幕进行编辑,用户编辑的文件直接显示在屏幕上,修改的结果可以立即显示出来,克服了行编辑器那种不直观的操作方式,便于用户学习和使用,具有强大的功能。本章主要介绍vi编辑器。

文本编辑器vi是linux系统的第一个全屏幕交互编辑程序,从诞生至今,该编辑器一直得到广大用户的青睐。vi是visual interface的简称,是所有计算机系统中最常用的一种工具,用户在使用计算机的时候,往往需要建立自己的文件,无论是一般的文本文件、数据文件还是编写的源文件,这些工作都离不开文本编辑器。它可执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的。vi不是一个排版程序,不像word或WPS那样可以对字体、格式、段落等其它程序进行编排,只是一个文本编辑程序。

vi没有菜单,只有命令,且命令繁多。vi有3中基本工作模式:命令行模式、文本编辑器模式和末行模式。

命令模式

命令模式是启动vi后进入的工作模式,可以转换为文本编辑模式和末行模式。在命令模式下,从键盘上输入的任何字符都被当做编辑命令来解释,而不会在屏幕上显示。如果输入的字符是合法的vi命令,则vi完成相应的动作;否则vi会响铃警告。任何时候,不管用户处于何种模式,只要按一下ESC键,即可使vi进入命令行模式;用户在shell环境下启动vi命令,进入编辑器时,也是处于该模式下。

文本编辑器(1.0)_操作符

文本编辑器(1.0)_VI_02

文本编辑模式

文本编辑模式用于字符编辑。在该命令下输入“i”(“插入”命令)、“a”(“附加”命令)“o”后进入文本编辑模式。此时输入任何字符都被vi当做文件内容显示在屏幕上。按ESC键可以从文本编辑模式返回到命令模式。

文本编辑器(1.0)_LINUX_03

末行模式

在命令模式下,按“:”进入末行模式,此时屏幕会在屏幕的底部显示“;”符号作为末行模式的提示符,等待用户输入相关命令。命令执行完毕后,vi自动回到命令模式。

文本编辑器(1.0)_LINUX_04

3种模式之间的相互转换

文本编辑器(1.0)_操作符_05

启动vi编辑器

启动单个文件

使用vi编辑器工作的第一步是进入该编辑界面。linux提供了进入vi比编辑器界面的命令

命令                                  说明

vi filename                       打开或新建文件,并将光标置于第一行首

vi +n filename                 打开文件,将光标置于第n行首

vi + filename                   打开文件,将光标置于最后一行首

vi + /pattern filename    打开文件,将光标置于第一个与pattern匹配的串行

vi -r filename                  在上次正用vi编辑器发生崩溃,恢复filename

vi filename1···filenamen 打开多个文件依次进行编辑

文本编辑器(1.0)_LINUX_06

提示:如果vi命令中的filename所对应的磁盘文件不存在,那么系统将生成一个名为filename的新文件供编辑。

启动多个文件

vi编辑器不仅可以启动单个文件进行编辑,还可以同时启动多个文件

文本编辑器(1.0)_文本编辑器_07

文本编辑器(1.0)_VI_08

文本编辑器(1.0)_操作符_09

文本编辑器(1.0)_命令模式_10

文本编辑器(1.0)_操作符_11

文本编辑器(1.0)_文本编辑器_12

文本编辑器(1.0)_文本编辑器_13

文本编辑器(1.0)_文本编辑器_14

文本编辑器(1.0)_文本编辑器_15

// 同时打开3个文件a、b、c,:n跳至下一个文件,:e#回到刚才编辑的文件。例如,当前编辑文件为a,:n跳至b,再:n跳至c,:e#回到b,想回到a的话用:e a

显示vi的行号

vi中的许多命令都要用到行号及行数等数值。若编辑的文件较大时,自己数行数是非常不方便的。为此vi提供了给文本加行号的功能。这些行号显示在屏幕的左边,而相应的内容则显示在相应的行号之后。

在末行模式下输入命令:

set nu //既set number的缩写

在一个较大的文件中,用户可能需了解光标当前行是哪一行,在文件中处于什么位置,可在命令模式下用组合键,此时vi会在显示窗口的最后一行显示出相应的信息,该命令可以在任何时候使用。

文本编辑器(1.0)_操作符_16

文本编辑器(1.0)_操作符_17

当然我们也可以不让它显示行号

文本编辑器(1.0)_操作符_18

文本编辑器(1.0)_VI_19

提示:这里加的行号只是显示给用户看的,他们并不是文件内容的一部分

文本编辑器vi的使用

命令行操作

在命令模式下,下面都是控制光标的移动

光标定位命令                                            功能

0(零)                                            将光标移到当前行的行首

^                                                      将光标移到当前行的行首

$                                                      将光标移到当前行的行尾

nnG                                                 将光标移到第nn行,nn为行号

G(:$)                                         将光标移到文件最后一行的行尾

-                                                      将光标移到上一行行首

+                                                     将光标移到下一行行首

nn|                                                  将光标移到当前行的第nn列,nn为列号

/abc                                                将光标移到文本中字符串abc下次出现的位置

L                                                     将光标移到屏幕的最下面一行

M                                                   将光标移到屏幕的中间一行

H                                                   将光标移到屏幕的最上面一行

fx                                                  在当前行中将光标移到下一个x,这里x是一个指定字符

n                                                   将光标移到前面发出的/word或? word命令中列出模式的下一个实例

''                                                   将光标返回到原来位置

b                                                  将光标移到上一个单词的开头

w                                                 将光标移到下一个单词的开头

e                                                  将光标移到下一个单词的词尾

h                                                  将光标左移一个字符

j                                                   将光标下移一行

k                                                  将光标上移一行

l                                                   将光标右移一个字符

(1)移动光标(重复的就不再说明)

前翻一屏(下翻):按【Ctrl+f】组合键

后翻一屏(上翻):按【Ctrl+b】组合键

前翻半屏:按【Ctrl+d】组合键

后翻半屏:按【Ctrl+u】组合键

(2)插入文本(进入输入模式)

在光标右边插入文本:输入“a”

在一行的结尾处添加文本:输入“A”

光标左处插入文本:输入“i”

在行首插入文本:输入“I”

在光标所在行的下一行插入新行:输入“o”

在光标所在行的上一行插入新行:输入“O”

(3)撤销操作

撤销前一个命令:输入“u”

撤销对一行的更改:输入“U”

(4)删除文本

删除一个字符:输入“x”

删除一词:输入“dw”

删除一行:输入“dd”

(5)复制和粘贴

复制一行内容:输入“yy”

粘贴:输入“p”

剪切:输入“dd”

(6)查找字符串

输入查找内容:输入“/”

跳到下一个出现处:输入“n”

跳到上一个出现处:输入“N”

(7)在命令模式中删除文本及撤销、重复相关操作

1.删除行

·删除光标所在的整行:输入“dd”

·表示删除当前行及其后n-1行(n为数字):输入“ndd”

2.删除多个字符

·D或d$表示删除从光标处开始到行尾的内容

·d0表示删除从光标前一字符开始到行首的内容

·dw表示删除一个单词,若光标处在某个单词中间,则从光标所在位置开始删至词尾,同dd命令一样可以在dw之前加上一个数字n,表示删除几个指定的单词

3.删除单个字符

·x表示删除光标处字符,nx删除从光标所在位置开始的n个字符

·X表示删除光标前面的那个字符,nX从光标前面那个字符开始向左的n个字符

(8)取消一次命令undo

U表示撤销对当前行所做的修改,前提是光标在当前行

u表示撤销最后一次修改,不论光标是够在修改行

(9)移动和复制文本

1.复制和粘贴行。将光标移到某一行上,输入命令“yy”;将光标移到要粘贴的位置上,输入命令“p”粘贴行

2.剪切和粘贴行。将光标移到要剪切的行上的任意字符处,输入命令“dd”;移动光标到需要的位置,输入命令“p”粘贴行。

3.复制单词和字符。将光标移到要复制单词的开头,输入命令“yw”;将光标移到文件中另外两个单词之间的空格,输入命令“p”粘贴单词或字符。

4.移动单词。将光标移到要移动的单词处,输入命令“dw”,将光标移到文件中另外两个单词之间的空格,输入“p”命令粘贴单词。

(10)移动字符

将光标移到文本中任一单词的首字母,输入“x”,然后输入“p”粘贴字符。

(11)复制和移动行的部分文本

选择当前行上的任意字符,输入“yfx”,将光标移到当前行的行尾,粘贴接出的文本。

如要删除当前行上从光标到第一个任意字符之间的文本,则选择当前行上的任意字符x输入“dfx”,将光标移到第一行尾粘贴删除的文本,输入“p”

下面将对文本对象进行删除、修改和接出的命令列出

对象                                                删除                                  修改                                    接出

行                                                 dd                                   cc                                     yy

行的剩余部分                                D或d$                             C或c$                                y$

当前行从光标到第一个x字符          dfx                                  cfx                                     yfx

单词                                              dw                                  cw                                     yw

字符                                              x                                      s                                       yl

删除操作符是“d”,修改操作符是“c”,接出操作符是“y”。如果想操作行,则输出操作符两次,如“dd”“cc”“yy”。删除和修改时,可以通过大写操作符来对行中光标之后的部分进行操作。所以3中操作符都可以用作行末对象。想对一行上从光标到一个字符x之间的文本进行操作,则将操作符放到“fx”的前面,如“dfx”“cfx”“yfx”命令。删除操作符“dw”、修改操作符“cw”、接出操作符“yw”可以对单词进行操作。

字符对象只部分符合上述模型。可使用“x”命令删除一个字符并用另外一个字符来替代它,使用“yl”接出光标处字符。

(12)复制文本块

用行号标识的文本块可以作为一个单位移动

1.若屏幕上没有显示行号,则输入“set number”

2.在命令模式下输入下列命令,并按enter键:

:10              //:10是第十行的地址。光标移到第十行

3.输入下列命令按enter键:

:2 copy 4              //文件第二行被复制到第四行的后面

:1,4 copy 7          //第1~4行之间的文本复制到第7行的后面

以冒号开头的编辑命令(:1,4copy9)对用户开始行号和结束行号标识的文本块进行操作,文本块的开始行号和结束行号用逗号隔开。注意要确保先输入小行号,再输入大行号,编辑器不能解释诸如62、57或9、2之类的行号。“copy”命令可以缩写为“co”,例如:

:10,14 co 0

:10,14 co $                      //此处$表示最后一行

:.,65 co 80                    //此处.表示当前行

(13)移动文本块

:1,8 move 17               //把1~8行的内容移动到17行之后

(14)另存文本块(假设在myfile1中执行如下命令)

:1,8 write myfile2          //把myfile1中第1~8行的内容重保存为myfile2

(15)覆盖文本块

:1,6 w>myfile2             //把myfile1中第1~6行的内容写在myfile2中

(16)向文件中追加文本

:5,8 w >>myfile2        //把myfile1中第5~8行的内容追加到myfile2中