资料来源:University of Hawaii at Manoa College of Engineering。
引言
VI编辑器是一个被许多Unix用户使用的基于屏幕的编辑器。VI编辑器具备强大的功能来帮助程序员,但是许多初学者因为要面对很多不同的指令而对使用VI敬而远之。写作本教程的目的就是要帮助初学者适应VI编辑器的使用,当然,也有一些小节的内容与VI的惯用者有关。在讲解的同时举出了很多的例子,最佳的学习方法就是试着在Unix下运行这些例子,并试着举一反三。在这个世界上,没有比自己亲自去经历更好的学习方式了。
约定
在本教程中,使用以下的约定:
^X表示一个控制字符。例如,如果你在教程中看到:^d,其意是你按下了ctrl键,然后敲入了相应的字母。对于本例来说,你就按下ctrl键,然后敲d。
开始之前
VI编辑器使用全屏幕,因此了解你使用的是何种类型的终端是有必要的。当你登录的时候,wiliki会问你的终端是什么。提示信息像这个样子:TERM = (vt100)。
如果你知道自己的终端是一个vt100(或者一个能够当作vt100用的模拟器),在你登录的时候,就为终端类型敲击回车键。如果你有一个hp终端,为终端类型输入“hp”并回车。如果你不确定自己的终端类型,问一个实验室的管理员,或者是请别人帮助你设置正确的终端类型。
如果在登录的时候,你犯了一个错误,输入了错误的终端类型,不要紧张,退出就行了。你可以输入以下的命令来修补设置:
首先,告诉你的shell你的终端是何种类型。(如果你不确定你的shell是什么,可以输入这个命令:echo $SHELL)。对于上面已经给出的例子,终端类型是“vt100”。用你拥有的任何终端类型去替换它。对于C shell(/bin/csh),命令是这个:set term=vt100。对于Bourne Shell(/bin/sh)或者是Korn Shell(/bin/ksh),命令如下:export TERM TERM=vt100。下一步,用这个命令重设你的终端:tset。
现在,终端的类型被正确设置(希望如此吧),你已经准备好来开始使用VI了。
启动VI编辑器
VI编辑器允许用户生成新的文件或编辑已存在的文件。启动VI编辑器的命令是:vi,紧接着是文件名。例如,为了要编辑一个叫做temporary的文件,你要输入“vi temporary”并回车。你也可以不用文件名来启动vi,但是当你想保存自己的工作的时候,你必须要告诉VI将要把这些内容保存到哪个文件中。
当你第一次启动VI的时候,你会看到在屏幕的左边充满了波浪号(像“~”)。在文件结束之后的任何空行都是如此显示。在屏幕的底部,文件名被显示出来。如果专门指定了一个已经存在的文件,文件的大小也会被显示出来,就像这样:"filename" 21 lines, 385 characters。
如果你指定的文件不存在,系统会告诉你这是一个新文件,就像这样:"newfile" [New file]。
如果你不要文件名而启动VI,当VI启动的时候,屏幕的底部会是空白。如果屏幕没有显示这些预期的结果,你的终端类型可能被错误地设置了。输入:q并回车来退出VI,并且修补你的终端类型。如果你不知道怎么做,问一下实验室管理员。
退出VI
你已经知道了如何进入VI,了解一下如何退出它也是很好的。VI编辑器有两种模式,为了退出VI,必须要处于命名(command)模式。敲击“Escape”或“Esc”键(如果你的终端没有这个键,可以试试^[,或control-[)来进入命名模式。如果在你敲击“Escape”的时候,你已经在命令模式之下,不要担心。系统会发出警告,但是你仍然处于命名模式。
离开VI的命令是:q。当处于命名模式之下,输入冒号以及“q”,并回车。如果你的文件被修改过了,编辑器会警告你,同时也不让你退出。为了忽略此消息,不保存就退出VI的命令是:q!。它让你不用保存任何改动而退出VI。
当然,一般说来,在一个编辑器中,你还是想保存你做出的改变。保存编辑器内容的命令是:w。你可以将以上命令和退出命令结合起来,即:wq。你可以指定一个不同的文件名来保存这些内容,这是通过在:w之后指定文件名来实现的。例如,你想将你正在编辑的文件保存为另外一个叫做filename2的文件名,你可以输入: w filename2并回车。
另外一种保存你的改变并退出VI的方法是ZZ命令。在命令模式下,输入ZZ,它会做与:wq相同的事情。如果文件的内容有任何改变,这些改变会被保存下来。这是离开编辑器的最容易的方法,只需要敲击键盘两次。
VI的两种模式
大多数用户了解VI编辑器的第一件事就是它有两种模式:command(命令)和insert(插入)。command模式允许命令条目来操纵文字。这些命令通常是一个或两个字符长,可以敲几下键盘便被输入了。insert模式将任何在键盘上敲击的内容输入现在的文件中。
VI是以command模式启动的。有几个命令来将VI编辑器转入insert模式。最常用的命令是a和i。这两个命令在前面已经描述过了。当你在insert模式下时,敲击退出(Escape)按钮,你就退出此模式了。如果你的终端没有这个键, ^[或control-[也行。你可以快速敲两下退出(Escape)按钮,这时VI肯定会在command模式之下的。当你已经在command模式之下时敲击退出(Escape)按钮并不会让编辑器退出command模式。系统会提醒你已经在此模式下了。
如何在命令模式下输入命令
命令(command)模式下的命令的格式一般是这样(括号中是可选的参数):[count] command [where]。
大多数命令只有一个字符长,包括那些使用控制字符的命令。本节中描述的命令是在VI编辑器中最经常使用的。
count可以是1到9之间的任何一个。例如,x命令删除在光标之下的那个字符。如果你在命令模式下输入23x,会有23个字符被删除。
一些命令使用一个可选的where参数,你可以指定命令影响到多少行或者是文件的多少部分。where参数也能够是任何移动光标的命令。
一些简单的VI命令
以下是一个简单的命令集合,它们足以让初学者起航。也有许多其它的方便的命令,这将在后续章节中讨论。
VI中的文字缓存
VI编辑器有36个缓存来存储文字片,同时也有一个通用目的缓存(general purpose buffer)。任何时候,在文件中,当一个文字块被删除或整形,它被放入通用目的缓存中。VI的大多数用户很少使用其它缓存,因此在没有其它缓存的情况下也能够活得很快活。如果被指定的话,文字块也能够被存储在其它缓存中。用''命令来指定缓存。在输入''之后,必须要输入指明缓存的字母或数字。例如,命令:"mdd使用了缓存m,最后的两个字符代表删除当前行。类似地,可以使用p或P命令来粘贴文字。"mp在当前光标位置之后粘贴缓存m的内容。对于之后两节所使用的任何命令,这些缓存被指定用于文字或段落的临时存储。
剪切与整形
用于剪切的常用命令是d。此命令从文件中删除文字。在这个命令之前是一个可选的count,之后是一个移动说明。如果你输入dd,会删除当前行。以下是这些命令的一些组合:
与d命令的功能类似,y命令从文件中提取文字而不删除文字。
粘贴
粘贴的命令是p或P。它们的区别仅在于当粘贴的时候相对于光标的位置。p在当前光标之后粘贴专门的或一般的缓存,而P则在当前光标之前粘贴专门的或一般的缓存。在粘贴命令之前指定数目(count)会将文字粘贴数次。
缩进代码与检查
VI编辑器有功能来帮助程序员将它们的代码布局得更加的整洁。有一个变量来为代码中的各级嵌套设定缩进。为了使用这个功能,可以阅读本教程的“customization section”一节。例如,将偏移宽度设为4个字符的命令是:set sw=4。
以下的命令缩进你的代码或移除缩进,同时也能够用count来指定:
VI编辑器也有一个有用的功能来帮助你在遇到悬挂圆括号或大括号的时候检查你的源代码。%命令会寻找与一个特别的右括号相对应的左括号,或与之相反。将光标放到一个括号上并敲击%来将光标移动到相应的括号。这个功能对于检查未闭合的括号是很有用的。如果有一个不匹配的括号存在,VI会发出嘟嘟声,这是在提示你没有发现配对的符号。
文字与字符搜索
VI编辑器有两类搜索:字符串和字符。对于一个字符串搜索,使用/和?命令。当你开始使用这个命令的时候,在最底部一行会显示你敲入的命令,在命令后面可以输入你想要搜索的特殊字符串。这两个命令仅在搜索发生的方向上有区别。在文件中,/命令向前(向下)搜索,?命令向后(向上)搜索。n和N命令分别在相同或相反的方向上重复之前的搜索命令。一些字符对于VI来说,有特殊的意义,因此在它们前面必须要放置一条斜线(/)来被当作搜索表达式的一部分。
特殊字符:
字符搜索在一行之内搜索来寻找在命令之后输入的一个字符。f和F命令只在当前行上搜索一个字符。f向前搜索,而F向后搜索,同时,光标会移动到所发现字符的位置。
t和T命令只在当前行上搜索一个字符,对于t来说,光标移动到字符之前的位置,而T向后搜索行到字符之后的位置。
这两套命令使用;和,命令来重复,其中;在相同方向上重复上一条字符搜索命令,而,在相反方向上重复上一条字符搜索命令。
VI(以及EX)的设置
你能够在启动的时候个性化(customization)VI的行为。有几个编辑选项使用:set命令,以下是在Wiliki上的VI和EX编辑器选项(你可以在命令模式下通过输入:set all并回车来获得此列表):
有一些选项具有用等号“=”设置的值,而其它选项有的有,有的没有。(这些开关类型叫做Boolean,在它们的前面有“no”来暗示它们不是设置的。)在此展示的选项是没有进行个性化设置的选项。下面用缩写给出了这些选项的描述。例如,命令设置自动缩进,可以输入:set autoindent或set ai。为了去除设定,你可以输入:set noautoindent或set noai。
写和将密钥(关键字)映射到其它密钥(关键字)
一个在VI编辑器中有用的EX编辑器命令是abbreviate命令。它让你为特殊的字符串设定缩写。此命令像这样:ab string thing to substitute for。例如,如果要敲入名字“Humuhumunukunukuapua`a”,但是你不想敲入整个名字,那么你可以使用缩写。在此例中,像这样敲入命令:ab 9u Humuhumunukunukuapua`a。
现在,当你单独敲入9u的时候,VI会敲入它所代表的整个字。如果你敲入了9university,它就不会替换这个字。
去除之前定义的缩写的命令是unabbreviate。例如,去除之前例子的命令就是":una 9u"。如果你要获取缩写列表,只需要简单地输入:ab,而不用任何定义。
另外一个对于个性化很有帮助的EX编辑器命令就是映射(mapping)命令。有两类映射(mapping)命令。一个用于命令模式,另一个用于插入模式。它们分别是:map和:map!。映射和缩写的工作方式类似,你给系统一个关键序列,并给系统另外一个关键序列去替换之前的序列。(被替换掉的关键序列通常是VI命令。)
EXINIT环境变量和.exrc文件
有两种方式来个性化VI编辑器。如果你在主目录下生成了一个叫做.exrc的文件,当VI启动的时候,那里面所有的命令都会被读到。另外一种方法是设置一个叫做EXINIT的环境变量。该选项在你的shell的建立文件里被设置。如果你使用/bin/csh (C-Shell),命令如下(被放置在.cshrc文件里面):setenv EXINIT '...'。
如果你使用/bin/sh or /bin/ksh,命令如下(被放置在.profile文件中):export EXINIT EXINIT='...'。
就像例子中所说的,不要放在…。在这个空间中,放置你想要建立的命令。例如,如果你想自动缩进,行编号,以及wrap边界三个字符,setenv命令(对于C shell来说)像这样:setenv EXINIT 'set ai nuwm=3'。
如果你想在setenv EXINIT中放置不止一个命令,用竖线(|)将命令隔开。例如,在命令模式中,要将“g”命令映射到“G”字符,命令是:map g G,与上面的命令结合,可以得到:setenv EXINIT 'set ai nuwm=3|map g G'。
如果你想生成叫做.exrc的文件,你可以在文件中放置与EXINIT之后的引用一样的东西。
当终端出现问题的时候恢复你的工作
VI编辑器编辑你的文件的一个临时副本,当编辑结束之后,或者当你叫它保存的时候,它就将临时文件的内容放到原始文件中。如果在你编辑文件的时候发生了故障,VI编辑器会试图保存你正在做的任何工作,并且为了之后的恢复而存储它。(注意:如果在你编辑文件的时候VI死掉了,它会给你发一封邮件告诉你如何恢复它。-r选项代表恢复。如果你正在编辑文件vitalinfo,而你意外退出了,“vi”编辑器的-r选项可以帮你忙。该命令像这样:vi -r vitalinfo。在使用-r选项一次之后,你必须要将你恢复的内容保存到实际的文件中。-r选项只能在每一个失败的VI会话中使用一次。)
有关在工作台上使用VI的警告
当你使用工作台时,必须要知道两件事情:一次(连续)编辑相同的文件许多次,以及改变屏幕的大小。
因为VI编辑你的原始文件的一个副本,并且将那个副本的内容保存到原始文件中,如果你登录了好几次,并且使用VI编辑相同的文件好几次,如果你一次保存在一个窗口上,然后又保存到另外一个窗口上,第一次保存的对于文件的改变会被覆盖掉。确保对于每个文件,你只是运行一个副本。
如果你使用一个工作台的一个终端程序,你可以通过拖动窗口的边界来改变屏幕的大小。如果你对大小还不尽满意,输入以下命令:eval `resize`。如果这个命令无效,另外一个命令如下:eval `/usr/bin/X11/resize`。
如果大小是错误的,编辑器不会正常运行。如果你对于屏幕尺寸存在任何疑问,可以向计算机实验室的管理员求助,他会帮你设置正确的尺寸。
VI命令的总结
以下是按照功能分类的VI命令的一个总结列表。有可能还会有其它命令,可以查看VI的在线手册。为了方便,你可以以文本文件方式保存该文件,然后删除你认为自己不会用的一些命令,并打印出剩下的较短的文件。
剪切与粘贴/删除文字
插入新的文字
在文件内移动光标
在屏幕上移动光标
替换文字
搜索文字或字符
操纵字符/行格式
保存与退出
其它一些指令
EX命令
VI编辑器建立在另外一个叫做EX的编辑器之上。EX编辑器只通过行来编辑。在VI编辑器中,用:命令来开始键入一个EX命令。以下的列表并不完全,但是给出的命令是用得比较多的。如果用某些命令(如“:s”和“:w”)来修改不止一行,在命令之前必须指定范围。例如,要替换掉从第3行到第15行的内容,命令是“:3,15s/from/this/g”。
:abstring strings
缩写。如果在VI中输入一个与strings相关的字,编辑器会自动插入相应的字。例如,缩写“:ab usa United States ofAmerica”会在输入“usa”的时候插入字“United States of America”。
:mapkeys new-seq
映射。此命令将一个关键字或一个关键字序列映射到另外一个关键字或一个关键字序列。
:q
退出VI。如果对内容有任何改动,编辑器会发出一个警告信息。
:q!
不保存而退出VI。
:s/pattern/to_pattern/options
替换。此命令用to_pattern中的字符串替换指定的pattern。如果没有参数(选项),此命令只是替换第一个出现的pattern。如果给定了“g”,所有出现的pattern都会被替换掉。例如,命令“:1,$s/Dwayne/Dwight/g”会替换掉将所有出现的“Dwayne”替换为“Dwight”。
:set[all]
给VI和EX设定一些个性化的选项。“:set [all]”命令给出了所有可能的选项。
:unastring
移除之前由“:ab”定义的缩写。
:unmkeys
移除由“:map”定义的移除映射。
:vifilename
开始编辑一个新文件。如果没有保存对内容作出的改动,编辑器会给出一个警告。
:w
写出当前文件。
:wfilename
将缓存写到指定的文件名。
:w>> filename
将缓存的内容追加到文件中。
:wq
写缓存并退出。