UNIX基础教程(第3版) 教学课件 ppt 作者 978-7-302-28608-0 chapter05
5-1,第5章 VI编辑器,5-2,主要内容,编辑器的概念 基本的vi使用及其命令 vi的部分高级功能 如何将vi定义为自己喜爱的工作风格以提高工作效率 如何复合简单的命令以及编写vi宏,5-3,5.1 vi的基本概念,Vi是Visual interface的简称,它是一个功能强大的全屏幕文本编辑器,是UNIX最重要的应用程序之一,它的作用是建立、编辑、显示ASCII码的文本文件。 Vi没有菜单,只有命令。 注意:Vi命令并不锁定所编辑的文件,因此多个用户可能同时编辑一个文件,那么最后保存的文件版本将被保留。,5-4,5.1 vi的基本概念,早期的UNIX提供的编辑器是行编辑ed,vi是全屏幕编辑器,现在所有的UNIX版本都支持。目前,行编辑ed还经常用于Shell脚本程序中,在脚本程序中,根据用户的输入信息修改一个文本文件的内容。行编辑程序ed的显示是面向行的,对终端的类型和特性没有任何的特殊要求和限制,ed程序本身也比较简单。vi可以交互式编辑文本文件,编辑是面向屏幕的,终端的类型设置必须正确,否则无法正常工作。由于vi在所有UNIX之间通用,也可以应用于各种各样的终端,占用系统资源很少,所以vi被广泛使用。,5-5,5.2 vi的基本操作,命令模式和输入模式 处于命令方式时,用户键入的内容被当作vi的命令来解释,一般处于命令方式下按键无回显(以冒号打头的命令和查找命令除外)。编辑命令i,a等,可以从命令方式转到输入方式。 处于输入方式时,用户键入的所有内容全部作为输入的正文内容,用户可以输入多行,每输入完一行后按回车键转入下一行,正文输入时有回显。输入完毕,按键盘左上角的Esc键,返回到命令方式。,5-6,5.2 vi的基本操作,vi中的命令模式和输入模式,5-7,5.2 vi的基本操作,Vi的启动方法 用法:vi filename 例如:vi abc.c,启动vi编辑文件abc.c。 vi有搜索命令和卷动功能,可以用来浏览文本文件,比more,less等更方便,但是应当避免在浏览时对文件无意中做出错误的修改。可以使用view代替vi进入编辑程序,就不允许修改文件内容。,5-8,5.2 vi的基本操作,vi的编辑命令 当vi处于命令状态时,用户的按键不回显,被解释成编辑命令,vi大约有100多个编辑命令。下面介绍的vi命令子集,足可以完成一般的编辑任务。,5-9,5.2 vi的基本操作,正文插入命令 a 在光标后附加文本 A 在本行行末附加文本 i 在光标前插入文本 I 在本行开始插入文本 o 在光标下插入新行 O 在光标上插入新行,5-10,5.2 vi的基本操作,在命令方式下,按下i键后,进入输入方式。从此以后,输入的文本在屏幕上回显,输入完一整行后,按下Enter键,继续输入下一行。输入结束后,按Esc键,退出输入方式,回到命令方式。回到命令方式之后,按键信息不再回显,所有的按键被解释为命令。许多传统的UNIX中,vi必须首先按下Esc键退出输入模式之后再移动光标到其他行,修改后,移动光标回来,再按下i命令(或者a,o,O)重新进入输入方式。在当前输入行的错误修正,使用Backspace键,不需要退出输入方式。 命令i,在当前光标处插入(insert)正文段,直至按Esc键。,5-11,5.2 vi的基本操作,除了i命令外,在当前光标后追加(append)正文段的命令a,也可以进入输入模式,直至按Esc键。 命令o,在当前行之下插入新行(open),进入输入模式,直至按Esc键。 大写字母O命令,在当前行之上插入新行(open),进入输入模式,直至按Esc键。,5-12,5.2 vi的基本操作,光标移动命令 1单字符移动 h 光标左移一列 j 光标下移一行 k 光标上移一行 l 光标右移一列 在vi中有许多命令可以在命令前加上一个整数,标志这个命令连续执行多少遍,5-13,5.2 vi的基本操作,删除命令: x 删除光标所在处字符 X 删除光标前面的字符 dd 删除光标所在行 3dd 删除从光标所在位置3行 D 删除从光标所在处到行尾 :5,10d 删除第5行到第10行,5-14,5.2 vi的基本操作,翻页 Ctrl+B键:向后翻页(Backward) Ctrl+F键:向前翻页(Forward) Ctrl+U键:向上翻半页(Up) Ctrl+D键:向下翻半页(Down),5-15,5.2 vi的基本操作,替换和取消命令: r 取代光标所在处字符 R 从光标所在处开始替换字符,按Esc结束 s 替换光标所在处字符,并进入文本输入方式 S 替换光标所在全行,按Esc结束 u 取消上一步操作 U 取消当前行的所有操作,5-16,5.2 vi的基本操作,文本复制命令: yyY 复制当前行 p 将已经选择或被删除的行放在当前行下 P 将已经选择或被删除的行放在当前行上,5-17,5.2 vi的基本操作,保存与退出命令: :w 保存 :w new_filename 保存为指定文件 :wq :x ZZ 保存并推出vi,5-18,5.3 一个vi的实例,(1) 输入vi mydog。 vi 启动并显示一个近乎空白的屏幕,光标停在第一行第一个字符的位置上,其他行用字符“”标出。 (2) 输入命令i(小写i)。 vi进入输入模式。 (3) 输入如下文本:,5-19,5.3 一个vi的实例,The quick brown fox jumped over the lazy dog. Through half-shut eyes, the dog watched the fox jump, and then wrote down his name. The dog drifted back to sleep and dreamed of biting the fox. What a foolish, sleepy dog,5-20,5.3 一个vi的实例,按Esc键,将回到命令模式中。vi不会示意已经处于命令模式中,但是如果再次按Esc键,终端会发出响铃。因此,多次按Esc键可以方便地确认是否退回到命令模式中。 (4) 输入如下命令到文件最后一行的开头: G (5) 将缓冲区内容写入一个新文件dog中并输入如下命令: :w dog,5-21,5.3 一个vi的实例,(6) 输入如下命令读出该文件: :r dog (7) 移到文件的第1行: 1G (8) 移到文件的第6行: 6G (9) 使用h、j、k和l命令,以一个字符的单位移动光标: ,5-22,5.4 vi进阶,搜索文本 vi中使用的搜索命令与ed中使用的相同。在文件中向前搜索,可以使用命令“/字符”, 例如: /lazy 将会使光标移到状态行上(屏幕最后一行上),并打印字符/lazy,然后刷新屏幕,将光标定位在下一个出现lazy的地方。,5-23,5.4 vi进阶,插入shell命令的输出 在编辑的文件中能够插入shell 命令的输出。例如,要在文件中插入一个时间戳,让它看起来像个日记,vi 可以执行一条命令并用其输出结果替换当前行。要创建一个时间戳,可以执行命令: :r !date 将把date 命令的输出读入内存,相当于如下形式:Thu May 28 16:24:04 EDT 2003,5-24,5.5 vi的设置选项,vi的选项 vi有40多个选项控制vi的运行。 1用.exrc文件控制 vi一启动后就自动读取用户自己主目录(Home Directory)下的文件.exrc,获取用户自设定的vi选项,未指定的选项按默认值处理。 如:建立文件.exrc,其中含有如下两行: set number set showmode 其中第一条命令使得vi在列出每一行时,在左边列出行号。第二条命令使得vi在屏幕右下角标志出当前是否处于输入状态。,5-25,5.5 vi的设置选项,2在vi中使用set命令 例: :set number 在列出每一行时,左边列出行号 :set showmode 在屏幕右下角标志出当前是否处于输入状态 :set nonumber 在列出每一行时,在左边不列出行号 :set noshowmode 在屏幕右下角不标志出当前是否处于输入状态 :set all 列出所有开关的当前状态,5-26,5.5 vi的设置选项,高级编辑选项: :set nu 显示行号 :set nonu 隐藏行号 :set ic 搜索忽略大小写 :set noic 搜索区分大小写 :set sm 函数空格回显 :set tabstop=4 设置tab空的宽度,5-27,5.5 vi的设置选项,:set ai :sync off 去掉颜色 :set nohlsearch 去掉搜索时产生的标识 :1,2 co 3 将1,2两行拷贝到第3行下 :1 r /etc/passwd 在编辑文件时读入另外一个文件内容到第一行下 :21 21G 到21行 :%s/old/new/g 替换全文指定字符串 :3,7s/old/new/g 替换3-7行的old改为new,5-28,5.5 vi的设置选项,搜索和替换命令: /string 向前搜索指定字符串 ?string 向后搜索指定字符串 n 搜索指定字符串的下一个出现位置 N 搜索指定字符串的上一个出现位置 :%s/old/new/g 替换全文指定字符串 :3,7s/old/new/g 替换3-7行的old改为new,5-29,5.5 vi的设置选项,高级编辑命令: G 到文件最后一行 1G 到文件第一行 vi编辑器的高级进阶: J 两行合并命令,5-30,5.6 应 用 vi,编写vi宏 vi 提供的map 功能可以将一系列编辑命令合成一个命令,并称之为宏。可以使用map 功能合成多达100 个vi 命令,并将它映射到任何一个按键上。,5-31,5.6 应 用 vi,输入宏 宏是一串从键盘上输入的命令字符。在定义宏之前,必须明白如何把宏输入到vi中,而且还必须了解vi 宏中包括的一些特殊字符。Esc( )和回车(M)字符是宏定义的一部分,需要用它们来退出输入模式或终止一个命令。命令是什么就输入什么命令字符。这样的宏是不会工作的。当按Esc键要退出输入模式,或当按Return键要跳入下一行(或结束一个命令)时是不能在宏中定义这些命令的。要将这些命令定义在宏中,需要使用CTRL -V命令,它告诉vi:“把下一个原义字符放在行中”。,5-32,5.6 应 用 vi,在输入模式中定义宏 可以定义仅在vi 输入模式中工作的宏。命令map!表明这样定义的宏将工作在输入模式中。定义这种宏的一般命令格式为: :map! macroname string Return 例如: :map! ZZ :wq M,5-33,5.6 应 用 vi,vispell 宏 可以使用带vispell 宏的vi 查找并更改拼写错误。将下面的宏定义放在.exrc文件或EXINIT变量中: map #1 1G! G vispell M 宏的名字叫做#1,指1号功能键或终端上的F1键。当按F1键时,右边定义的宏将被启动,它完成如下操作:移到第1行(1G);启动spell (!);取下从当前行(第1行)至最后(G)的文本,将它作为命令(vispell)输入;结束该行命令(M);回到命令模式( )。,5-34,5.6 应 用 vi,search(搜索)宏 search 宏提供了一种高效手段来查找使用vispell 发现的拼写错误。,