- 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