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命令,进入编辑器时,也是处于该模式下。
文本编辑模式
文本编辑模式用于字符编辑。在该命令下输入“i”(“插入”命令)、“a”(“附加”命令)“o”后进入文本编辑模式。此时输入任何字符都被vi当做文件内容显示在屏幕上。按ESC键可以从文本编辑模式返回到命令模式。
末行模式
在命令模式下,按“:”进入末行模式,此时屏幕会在屏幕的底部显示“;”符号作为末行模式的提示符,等待用户输入相关命令。命令执行完毕后,vi自动回到命令模式。
3种模式之间的相互转换
启动vi编辑器
启动单个文件
使用vi编辑器工作的第一步是进入该编辑界面。linux提供了进入vi比编辑器界面的命令
命令 说明
vi filename 打开或新建文件,并将光标置于第一行首
vi +n filename 打开文件,将光标置于第n行首
vi + filename 打开文件,将光标置于最后一行首
vi + /pattern filename 打开文件,将光标置于第一个与pattern匹配的串行
vi -r filename 在上次正用vi编辑器发生崩溃,恢复filename
vi filename1···filenamen 打开多个文件依次进行编辑
提示:如果vi命令中的filename所对应的磁盘文件不存在,那么系统将生成一个名为filename的新文件供编辑。
启动多个文件
vi编辑器不仅可以启动单个文件进行编辑,还可以同时启动多个文件
// 同时打开3个文件a、b、c,:n跳至下一个文件,:e#回到刚才编辑的文件。例如,当前编辑文件为a,:n跳至b,再:n跳至c,:e#回到b,想回到a的话用:e a
显示vi的行号
vi中的许多命令都要用到行号及行数等数值。若编辑的文件较大时,自己数行数是非常不方便的。为此vi提供了给文本加行号的功能。这些行号显示在屏幕的左边,而相应的内容则显示在相应的行号之后。
在末行模式下输入命令:
set nu //既set number的缩写
在一个较大的文件中,用户可能需了解光标当前行是哪一行,在文件中处于什么位置,可在命令模式下用组合键,此时vi会在显示窗口的最后一行显示出相应的信息,该命令可以在任何时候使用。
当然我们也可以不让它显示行号
提示:这里加的行号只是显示给用户看的,他们并不是文件内容的一部分
文本编辑器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中