• 1. 第5章 UNIX的编辑器5-1
  • 2. 主要内容基本的vi和emacs使用及其命令 vi和emacs的部分高级功能 如何将vi定义为自己喜爱的工作风格以提高工作效率 如何复合简单的命令以及编写vi宏5-2
  • 3. 5.1 vi的基本概念 Vi是Visual interface的简称,它是一个功能强大的全屏幕文本编辑器,是UNIX最重要的应用程序之一,它的作用是建立、编辑、显示ASCII码的文本文件。 Vi没有菜单,只有命令。 注意:Vi命令并不锁定所编辑的文件,因此多个用户可能同时编辑一个文件,那么最后保存的文件版本将被保留。5-3
  • 4. 5.2 vi的基本操作命令模式和输入模式 处于命令方式时,用户键入的内容被当作vi的命令来解释,一般处于命令方式下按键无回显(以冒号打头的命令和查找命令除外)。编辑命令i,a等,可以从命令方式转到输入方式。 处于输入方式时,用户键入的所有内容全部作为输入的正文内容,用户可以输入多行,每输入完一行后按回车键转入下一行,正文输入时有回显。输入完毕,按键盘左上角的Esc键,返回到命令方式。 5-4
  • 5. 5.2 vi的基本操作vi中的命令模式和输入模式5-5
  • 6. 5.2 vi的基本操作Vi的启动方法 用法:vi filename 例如:vi abc.c,启动vi编辑文件abc.c。 vi有搜索命令和卷动功能,可以用来浏览文本文件,比more,less等更方便,但是应当避免在浏览时对文件无意中做出错误的修改。可以使用view代替vi进入编辑程序,就不允许修改文件内容。 5-6
  • 7. 5.2 vi的基本操作vi的编辑命令 当vi处于命令状态时,用户的按键不回显,被解释成编辑命令,vi大约有100多个编辑命令。下面介绍的vi命令子集,足可以完成一般的编辑任务。5-7
  • 8. 5.2 vi的基本操作正文插入命令 a [在光标后附加文本] A [在本行行末附加文本] i [在光标前插入文本] I [在本行开始插入文本] o [在光标下插入新行] O [在光标上插入新行] 5-8
  • 9. 5.2 vi的基本操作在命令方式下,按下i键后,进入输入方式。从此以后,输入的文本在屏幕上回显,输入完一整行后,按下Enter键,继续输入下一行。输入结束后,按Esc键,退出输入方式,回到命令方式。回到命令方式之后,按键信息不再回显,所有的按键被解释为命令。许多传统的UNIX中,vi必须首先按下Esc键退出输入模式之后再移动光标到其他行,修改后,移动光标回来,再按下i命令(或者a,o,O)重新进入输入方式。在当前输入行的错误修正,使用Backspace键,不需要退出输入方式。 命令i,在当前光标处插入(insert)正文段,直至按Esc键。5-9
  • 10. 5.2 vi的基本操作除了i命令外,在当前光标后追加(append)正文段的命令a,也可以进入输入模式,直至按Esc键。 命令o,在当前行之下插入新行(open),进入输入模式,直至按Esc键。 大写字母O命令,在当前行之上插入新行(open),进入输入模式,直至按Esc键。 5-10
  • 11. 5.2 vi的基本操作光标移动命令 1.单字符移动 h 光标左移一列 j 光标下移一行 k 光标上移一行 l 光标右移一列 在vi中有许多命令可以在命令前加上一个整数,标志这个命令连续执行多少遍5-11
  • 12. 5.2 vi的基本操作删除命令: x [删除光标所在处字符] X [删除光标前面的字符] dd [删除光标所在行] 3dd [删除从光标所在位置3行] D [删除从光标所在处到行尾] :5,10d [删除第5行到第10行]5-12
  • 13. 5.2 vi的基本操作翻页 Ctrl+B键:向后翻页(Backward) Ctrl+F键:向前翻页(Forward) Ctrl+U键:向上翻半页(Up) Ctrl+D键:向下翻半页(Down)5-13
  • 14. 5.2 vi的基本操作替换和取消命令: r [取代光标所在处字符] R [从光标所在处开始替换字符,按Esc结束] s [替换光标所在处字符,并进入文本输入方式] S [替换光标所在全行,按Esc结束] u [取消上一步操作] U [取消当前行的所有操作]5-14
  • 15. 5.2 vi的基本操作文本复制命令: yy\Y [复制当前行] p [将已经选择或被删除的行放在当前行下] P [将已经选择或被删除的行放在当前行上]5-15
  • 16. 5.2 vi的基本操作保存与退出命令: :w [保存] :w new_filename [保存为指定文件] :wq :x ZZ [保存并推出vi]5-16
  • 17. 5.3 一个vi的实例(1) 输入vi mydog。 vi 启动并显示一个近乎空白的屏幕,光标停在第一行第一个字符的位置上,其他行用字符“~”标出。 (2) 输入命令i(小写i)。 vi进入输入模式。 (3) 输入如下文本:5-17
  • 18. 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-18
  • 19. 5.3 一个vi的实例按Esc键,将回到命令模式中。vi不会示意已经处于命令模式中,但是如果再次按Esc键,终端会发出响铃。因此,多次按Esc键可以方便地确认是否退回到命令模式中。 (4) 输入如下命令到文件最后一行的开头: G (5) 将缓冲区内容写入一个新文件dog中并输入如下命令: :w dog5-19
  • 20. 5.3 一个vi的实例(6) 输入如下命令读出该文件: :r dog (7) 移到文件的第1行: 1G (8) 移到文件的第6行: 6G (9) 使用h、j、k和l命令,以一个字符的单位移动光标: ……5-20
  • 21. 5.4 vi进阶搜索文本 vi中使用的搜索命令与ed中使用的相同。在文件中向前搜索,可以使用命令“/字符”, 例如: /lazy 将会使光标移到状态行上(屏幕最后一行上),并打印字符/lazy,然后刷新屏幕,将光标定位在下一个出现lazy的地方。 5-21
  • 22. 5.4 vi进阶插入shell命令的输出 在编辑的文件中能够插入shell 命令的输出。例如,要在文件中插入一个时间戳,让它看起来像个日记,vi 可以执行一条命令并用其输出结果替换当前行。要创建一个时间戳,可以执行命令: :r !date 将把date 命令的输出读入内存,相当于如下形式:Thu May 28 16:24:04 EDT 2003 5-22
  • 23. 5.5 vi的设置选项vi的选项 vi有40多个选项控制vi的运行。 1.用.exrc文件控制 vi一启动后就自动读取用户自己主目录(Home Directory)下的文件.exrc,获取用户自设定的vi选项,未指定的选项按默认值处理。 如:建立文件.exrc,其中含有如下两行: set number set showmode 其中第一条命令使得vi在列出每一行时,在左边列出行号。第二条命令使得vi在屏幕右下角标志出当前是否处于输入状态。 5-23
  • 24. 5.5 vi的设置选项2.在vi中使用set命令 例: :set number 在列出每一行时,左边列出行号 :set showmode 在屏幕右下角标志出当前是否处于输入状态 :set nonumber 在列出每一行时,在左边不列出行号 :set noshowmode 在屏幕右下角不标志出当前是否处于输入状态 :set all 列出所有开关的当前状态5-24
  • 25. 5.5 vi的设置选项高级编辑选项: :set nu [显示行号] :set nonu [隐藏行号] :set ic [搜索忽略大小写] :set noic [搜索区分大小写] :set sm [函数空格回显] :set tabstop=4 [设置tab空的宽度]5-25
  • 26. 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-26
  • 27. 5.5 vi的设置选项搜索和替换命令: /string [向前搜索指定字符串] ?string [向后搜索指定字符串] n [搜索指定字符串的下一个出现位置] N [搜索指定字符串的上一个出现位置] :%s/old/new/g [替换全文指定字符串] :3,7s/old/new/g [替换3-7行的old改为new]5-27
  • 28. 5.5 vi的设置选项高级编辑命令: G [到文件最后一行] 1G [到文件第一行] vi编辑器的高级进阶: J [两行合并命令]5-28
  • 29. 5.6 应 用 vi编写vi宏 vi 提供的map 功能可以将一系列编辑命令合成一个命令,并称之为宏。可以使用map 功能合成多达100 个vi 命令,并将它映射到任何一个按键上。5-29
  • 30. 5.6 应 用 vi输入宏 宏是一串从键盘上输入的命令字符。在定义宏之前,必须明白如何把宏输入到vi中,而且还必须了解vi 宏中包括的一些特殊字符。Esc( ^[ )和回车(^M)字符是宏定义的一部分,需要用它们来退出输入模式或终止一个命令。命令是什么就输入什么命令字符。这样的宏是不会工作的。当按Esc键要退出输入模式,或当按Return键要跳入下一行(或结束一个命令)时是不能在宏中定义这些命令的。要将这些命令定义在宏中,需要使用CTRL -V命令,它告诉vi:“把下一个原义字符放在行中”。 5-30
  • 31. 5.6 应 用 vi在输入模式中定义宏 可以定义仅在vi 输入模式中工作的宏。命令map!表明这样定义的宏将工作在输入模式中。定义这种宏的一般命令格式为: :map! macroname string Return 例如: :map! ZZ ^ [ :wq ^ M 5-31
  • 32. 5.6 应 用 vivispell 宏 可以使用带vispell 宏的vi 查找并更改拼写错误。将下面的宏定义放在.exrc文件或EXINIT变量中: map #1 1G! G vispell ^ M ^ [ 宏的名字叫做#1,指1号功能键或终端上的F1键。当按F1键时,右边定义的宏将被启动,它完成如下操作:移到第1行(1G);启动spell (!);取下从当前行(第1行)至最后(G)的文本,将它作为命令(vispell)输入;结束该行命令(^M);回到命令模式(^ [)。5-32
  • 33. 5.6 应 用 vi search(搜索)宏 search 宏提供了一种高效手段来查找使用vispell 发现的拼写错误。 5-33
  • 34. 5.7 使用emacs 设置终端 就像在vi 编辑器中那样,在使用emacs 之前第一件事就是设置所使用的终端类型。可以通过设置一个shell 的环境变量来完成它。例如,输入: $ TERM=vt100 $ export TERM 将终端变量设置为型号是DEC vt100 的终端,并将该信息传给程序。5-34
  • 35. 5.7 使用emacs启动emacs 要编辑一个文件,应该使用如下命令: $ emacs mydog emacs 读入文件并且在窗口中显示几行 5-35
  • 36. 5.7 使用emacs在emacs中创建文本 在emacs 中没有单独的输入模式。emacs 总是处在输入模式中,所有输入的标准字符都将进入到编辑缓冲区中。 退出emacs 当完成正文的输入后,输入下面的命令: CTRL -X CTRL -C 将会从编辑器中退出。 5-36
  • 37. 5.7 使用emacs窗口中移动光标 CTRL -F 向右移一个字符单位 CTRL -B 向左移一个字符单位 CTRL -N 移至下一行 CTRL -P 移至上一行 CTRL -E  移至当前行的行尾 CTRL -A 移至当前行的行首5-37
  • 38. 5.7 使用emacs移动缓冲区中的窗口 CTRL –V 向前移动一个屏幕 Esc -V 向后移动一个屏幕 CTRL –L 刷新屏幕,将当前行至于屏幕中央 5-38
  • 39. 5.7 使用emacs删除文本 DEL 删除上一行字符 CTRL –D 删除当前光标处的字符 Esc –DEL 删除上一个词 Esc –D 删除当前光标处的词 CTRL –K 删除到行尾的所有字符 CTRL –W 删除从标号到光标之间的所有字符 CTRL -@ 设置标号 CTRL -X 交换标号与光标的位置 CTRL –Y 将删除的文本移入缓冲区5-39
  • 40. 5.7 使用emacs增量搜索 增量搜索的字符串是输入的字符串,即当输入要搜索字符串的第一个字母时,emacs 将查找以这个字母开头的第一个单词,当输入要搜索字符串的第二个字母时,emacs 将查找以这两个字母开头的第一个单词,依此类推。要在文件中使用增量搜索查找一个字符串,使用下面的命令: CTRL -S 向前查找字符串 CTRL -R  反向搜索字符串5-40
  • 41. 5.7 使用emacs正则表达式搜索 emacs 同样支持正则表达式搜索。它支持ed、grep 和diff 使用的正则表达式语法。除此之外,emacs 还使用一些新定义的正则表达式语义(例如“\<”的意义是“缓冲区中光标位置之前”)。 正则表达式搜索在简单搜索命令中不使用,它们用在命令re-search (regular expression search)中。5-41
  • 42. 5.7 使用emacs例如: re-search-forward re-search-reverse re-query-replace-string re-replace-string 5-42
  • 43. 5.7 使用emacs修改文本 SPACEBAR 替换当前字符串并跳至下一个 y     替换当前字符串并跳至下一个 n     不替换当前字符串跳至下一个 . 替换一个并退出 Esc 退出 !    替换当前字符串及其他所有字 符串,不要给出提示替换当前 的字符串并退出 5-43