Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103695065
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-05-06 13:04:17

作者: wehen | 来源:

vim编辑器安装与使用

vi是一个历史悠久的编辑器,已经被广泛使用在Unix-1ike系统上,在大部份的Unix-like系统里面都附有vi编辑器,因此,学好Vi编辑器是很重要的事! 在Unix-like系统中,编辑器有多套与vi相同的,还有一套叫emacs的编辑器,稍后我们会接着介绍的。

现在介绍的是vim (vi的改良版,是vi的克隆,几乎每一个版本的Linux都有提供)创建和编辑文件。(本文介绍的使用方法都适用于vi和vim。)然后,我将深入介绍了vim命令的一些细节,并说明了如何使用参数和如何定制vim来满足大家的需求。最后对vim命令来个概括总结。如要进一步了解vim的朋友,请参閱主页。

vim功能强大,我们选择其中的某些功能进行描述。如果vim对大家来说是全新的,那么,大家会发现本文所描述的有限命令集合仍然是很丰富的。为完成某些特定的编辑任务,vim编辑器提供了很多方法。学习vim的最好的方法是首先学习能完成基本编辑操作的命令集合。当对编辑器有了一些了解后,再学习其他使操作更快更有效的命令。接下来,将介绍用来创建和编辑文件的vim命令和功能,这些命令和功能虽然基本但非常有用。

从终端中安装的命令:

sudo apt-get install vim-gtk


或从图形界面的安装:打开Synaptic (新立的软件包安装套件)

① 选择vim套件

② 按应用-安装






启动vim

当完成vim编辑器安装后,我们来启动vim,在终端里使用以下指令可以实现文件practice的创建和编辑:

$ vim practice

当按下Enter键后,指令行消失,屏幕显示内容如图10-1。





屏幕左端的代字符(~)表明文件是空的。当用户向文件中添加文本行时,代字符(~)就会消失。如果屏幕看上去有点扭曲变形,那么,用户的终端类型可能没有设置正确。

如果启动vim的终端类型不在terminfo数据库中,那么,vim将显示错误消息,并且终端类型默认为ansi (许多终端都是此类型)。下面的范例中,用户将终端类型vt100错误地输入为vgl00。




如想重新设置终端类型,可按下Esc键,使用下面的命令退出vim,同时返回到shell提示符。

当输入冒号(: )时,vim将把光标移动到屏幕的底部,接着输入“q” 将退出vim并且不
保存任何修改。(通常情况下,都需要保存修改,所以,很少以这种方式退出vim。)在输
入完命令后,要按下Enter键。当用户返回到了shell提示符,之后再次启动vim。

如果用户在启动vim时没有指定文件名,那么,vim将认为用户是一个新手,并且会告知用户如何启动(如图10-2所示)。





practice是一个新文件,它不包含任何文本信息。vim将在终端的状态行(底部)显示类似于图10-l所示的信息,来表明用户正在创建并编辑一个新文件。如果要编辑一个已有文件,那么vim将显示该文件的前面部分的信息,并在状态行给出该文件的状态信息。

命令模式和输入模式

vim有两个操作模式:命令模式(也称为普通模式)和输入模式(如图10-3所示)。当vim处于命令模式时,可输入vim命令,如删除文本的命令、退出vim的命令。可以通过输入命令将vim切换到输入模式。在输入模式中,vim将接受用户输入的任何文本信息,并将它们显示在屏幕上。按下Esc键,vim将返回到命令模式。






默认情况下,vim会显示其所处的模式。例如,当vim处于Insert模式时,屏幕的左下角会显示:- -INSERT- -。

下面的命令将使得文本每行的左端显示对应行号:

:set number RETURN

最后一行模式上面命令中的冒号(:)使得vim切换到了另一种模式:最后一行模式。在这种模式下,光标将始终处于屏幕底部。当输入完命令按下Enter键后,vim才将光标恢复到原来在文本中的位置。输入命令:set nonumber将不再显示行号。

vim区分大小写

在vim中输入命令时,请注意区分大小写, 这点是最重要的。因为vim区分大小写,它会把字母相同但大小写不同的两个命令认为是不同的命令。要特别注意CapsLock(ShiftLock) 键。如果在输入模式下,为了输入大写字母,用户将CapsLock键打开,当用户退出到命令模式时,若在该键仍打开的情况下输入命令,那么vim不会执行用户输入的命令。

输入文本

输入模式(i/a) 启动vim之后,在输入文本之前,必须通过按下i 键(在光标前插入字符)或者 a 键(在光标后追加字符)将vim切换到输入模式。

如果不能确定vim当前是否处于输入模式,那么,无论vim当前是处于输入模式,还是在嘀嘀响或出现闪烁,或者是已经处于命令模式但没有做任何事情,按下Esc键将使得vim进入命令模式,然后再按下 i 或者 a 键进入输入模式。

当vim处于输入模式时,便可通过键盘输入文本。如果屏幕显示的内容不是用户所输入的,则说明vim当前不是处于输入模式。

现在让我们来按照图10-4所示内容,输入示例文本学习,在每行的末尾按下Enter键。如果当光标到达屏幕或者窗口右端时,不按下Enter键,那么,vim将限制继续往右端输入文本,并自动换行到下一行。在这种情况下,物理行将不与显示行(逻辑行)对应,这会使某些编辑操作变得困难。






当使用vim时,可以对输入文本所犯的错误进行校正。如果发现输入的某行内容有错,那么可以随时(修改完后再输入其他内容或者最后一起修改)对这些错误进行修改。当输入完成后,按下Esc键将返回到vim的命令模式。


获取帮助(help)

在使用vim时,输入命令:help【feature】后按下Enter键可以获得帮助信息(输入此命令时要保证vim处于命令模式)。其中的冒号(:)将使光标移到屏幕最后一行。如果输入:help,那么vim将显示vim帮助的介绍信息(如图10-5所示)。屏幕上黑条中的内容说明了黑条上面显示文件的名字。显示每个文件的区域(例如,图10-5中的两个区域)称为vim的一个窗口。在图10-5中,文件help.txt占据了屏幕的大部分,正在编辑的文件practice仅占据了几行,位于屏幕的下面部分(称为下面的窗口)。





可以使用滚动来查看帮助文档介绍的内容。按 j 键或者方向键中的向下键可以将光标一行行地往下移动。按下Ctrl+D组合键将把光标下移半个窗口;按下Ctrl+U组合键将把光标上移半个窗口。输入命令:q!将关闭帮助窗口。

在命令模式下,输入命令:help insert可以获得一些插入命令的帮助信息(如图10-6所示)。






① 在输入模式下校正文本

在vim输入模式下,那些校正shell命令行的回退键具有同样的功能。这些键包括字符删除键(Ctrl+H)、行删除键(Ctrl+U)和字删除键(Ctrl+W)。虽然有时用这些键删除文本后,vim在屏幕上仍然显示这些文本,但当移动光标经过这些文本或者按下Enter键时,用户就会发现编辑器已经将它们删除了。


② 移动光标

删除、插入和校正文本都需要移动光标。当vim处于命令模式时,可以使用Enter键、空格键和方向键来移动光标。如果用户更喜欢将手放置在靠近键盘中心的地方,或者用户使用的终端没有方向键,或者用户使用的模拟器不支持方向键,那么可以使用h、j、k和l(小写英文字母1)分别向左、下、上、右移动光标。


③ 删除文本

删除字符(x),删除字(dw),删除行(dd) 在命令模式下,可以删除一个字符、一个字和一行。将光标移到要删除的字符,输入命令x即可删除光标所经过字符;将光标移到要删除字的第1个字母,输入命令dw(Delete Word,删除字)即可删除该字;将光标移到要删除的行的任意位置,输入命令dd即可删除光标所在的行。


④ 撤销误操作

撤销(u) 当错误地删除了某个字符、字或行时,或者当想撤销某个命令的执行时,可以通过在要撤销的操作后立即输入命令u(Undo)来撤销操作,vim编辑器会将文本恢复到上一个命令执行前的状态。若再次输入u,则恢复到倒数第2次操作执行前的状态,依次类推。使用命令u可以撤销很多操作。若设置了compatible参数,那么vim就只能撤销最近一次的修改。

重做(:redo) 当撤销某个命令后又想重新执行该命令,可输入命令:Ctrl+R或者输入命令:redo后按下Enter键,vim将重新执行被撤销的命令。像撤销命令一样,重做命令也可以连续执行多次。


⑤ 添加文本

插入(i)与追加(a) 向正在编辑的文本中插入新内容的步骤为:首先将光标移到要插入文本位置之后的那个字符处,然后输入命令i(insert,插入),使vim处于输入模式,这时便可在光标之前插入文本,输入完毕后按下ESCAPE键,返回到vim的命令模式。或者将光标移到要插入文本位置之前的那个字符处,然后输入命令a(append,追加),这时便可在光标之后追加新内容。

打开(o和O) 为了添加一行或者多行,将光标移到要加入行的上面一行,输入命令o(open,打开),vim将在光标所在行的下方打开一个空白行,同时将光标移到新的空白行,此时便可输入新内容,一行结束时可按下Enter键。当完成文本的输入时,按下Esc键退回到vim的命令模式。命令O与o的工作方式类似,不同之处仅在于,输入命令O后,vim将在光标所在行的上方打开一个空白行。


⑥ 校正文本

为了校正文本,可使用dd、dw和x删除错误的文本内容,然后使用i、a、o和O插入正确的新文本内容。

在图10-4中,要将单词pressing更改为hitting,可以使用方向键将光标移到单词pressing的字符p处,按下命令dw删除该单词,然后,输入命令i进入vim的输入模式,输入单词hitting和空格,按下Esc键。这样,单词就会被更改并且vim返回到了命令模式,等待下一个命令的输入。命令dw和i可以用一个命令cw(change word,修改单词)来实现,命令CW可以使vim处于输入模式。


发送给打印机的页中断信号
=======================================================================
注意:Ctrl+L是发送给打印机的一个信号,使得打印机从当前位置直接跳到下一页头部。在输入模式下,在文档的任何位置都可以按下Ctrl+L来实现该字符的输入,如果没有显示^L,可在Ctrl-L之前按下Ctrl+V。


结束编辑会话

在编辑过程中,vim将编辑的文本放置在称为工作缓冲区(work buffer)的地方。当结束编辑时,必须将工作缓冲区的内容写到磁盘,这样才能将对文本的修改保存起来,以便于下一次使用。

在vim处于命令模式下,输入命令ZZ(必须使用大写的Z)即可将新写入的内容保存
到磁盘上,并且结束编辑会话,vim返回到shell控制。如果用户不想保存所做修改,那
么用户可以使用命令:q 退出。


不要将ZZ与Ctrl+Z混淆
=======================================================================
注意:退出vim要输入ZZ而不是Ctrl+Z(通常为挂起键)。若使用Ctrl+Z,则vim将从屏幕上消失,好像是退出了。但事实上,vim仍在后台继续运行着,并且没有保存前面对文件的编辑修改。如果此时用户输入另一个vim命令再一次编辑该文件,那么,vim将显示一个关于交换文件的信息。


compatible参数

compatible参数使得vim与vi更加兼容。默认情况下,设置此参数可以使得vim与vi更接近。建立初始化文件 ~/.vimrc时,compatible参数是未设置的,vim仍然是vim,启动vim时,可以忽略该参数。

设置compatible参数可以从多方面改变vim的工作方式。例如,设置compatible参数后,撤销命令只能撤销最近一次所做的修改;而如果没有设置compatible参数,撤销命令可以撤销许多次修改。本章在compatible参数有影响时都会给出提示。输入命令:help compatible,然后按下Enter键即可得到关于compatible参数的更多细节。输入命令:help vi-diff,然后按下Enter键可以获得vim与最初的vi的所有不同之处的完整列表。

在命令行上使用 -C选项可以设置compatible参数,使用-N选项可撤销对compatible参数的设置。更多关于如何在使用vim时修改compatible参数的信息。

vim的特性介绍

本节将讨论操作模式、联机帮助、工作缓冲区、应急处理和其他的shell特性。输入命令vim带选项- -version可以获得vim的更多版本信息。


联机帮助

如前所述,在使用vim时可以查看帮助信息。输入命令:help feature将获得feature的相关信息。当滚动浏览这些帮助信息时,用户会看到用两条竖线括起来的单词,如
|tutor|,这些都是活动链接(active link),将光标移到这些活动链接,按下Ctrl+]即可跳到对应的链接文本。使用Ctrl+o(小写的o)可返回帮助文本。也可以使用活动链接的单词替换命令:help.feature中的feature,这样就可以获得该单词对应特性的相关信息。例如,对于引用|credits|,输入命令:help credits,然后按下Enter键即可得到关于credits的更多信息。输入:q将退出帮助窗口。

使用帮助系统经常需要浏览的vim的feature包括:insert(插入文本)、delete(删除文本)和opening-window(打开窗口)。用户可能对opening-window特性很陌生,但没关系,随着对vim的更多使用,用户会慢慢熟悉这些特性的。输入命令:help doc-file-list可以得到帮助文件的完整列表。虽然vim是一个自由软件,但该程序的开发者建议用户们在使用这些免费软件时捐助一点钱,(如果大家是在股票投资得益的话)帮助乌干达国家的孩子们(输入命令:help uganda可获取更多信息)。


操作模式

vim编辑器是ex编辑器的一部分,共有5个操作模式:

● ex命令模式
● ex输入模式
● vim命令模式
● vim输入模式
● vim最后一行模式

在命令模式下,vim将输入的字符作为命令对待,并对每个命令做出回应,但不显示这些字符;在输入模式下,vim将输入字符作为文本放置在正编辑的文本中;所有以冒号(:)开始的命令将使vim处于最后一行模式,冒号将光标移到屏幕的底部一行,输入的命令将在该行显示。

最后一行模式和命令模式除了光标位置不同外,还有一点不同,就是命令模式结束命令不必包含按下Enter键,而最后一行模式结束命令必须按下Enter键。

通常情况下,不使用ex模式。本章提到的输入模式和命令模式,指的都是vim模式下的,而不是ex模式。

刚启动编辑会话时,vim处于命令模式。此时,一些命令如插入命令和追加命令可以将vim切换到输入模式。按下Esc键,vim将返回到命令模式。

一些修改和替换命令首先工作在命令模式下,然后切换到输入模式下工作。修改命令删除要修改的文本,将vim从命令模式切换到输入模式下,以便插入新文本内容;替换命令删除要替换的字符,并且插入新的字符。图10-3展示了在模式问切换的一些方法。


注意查看模式和CapsLock键
=======================================================================
警告:命令模式下输入的任何字符几乎都对vim产生影响,因此,若把实际处于命令模式的vim误认为处于输入模式,输入字符可能会带来一些麻烦。学习vim时,要确保设置了showmode参数(默认情况下已设置),这样vim会对所处模式给出提示。输入命令:set laststatus=2可以将状态行打开,其中的状态信息是很有帮助的。也要特别注意CapsLock键的状态。在命令模式下,输入大写字母和小写字母产生的效果是不同的。如果不注意,可能会使vim给出“错误的”回应。
=======================================================================


显示

vim编辑器使用状态行和一些特殊字符来显示编辑会话中的一些信息。

① 状态行
vim编辑器在显示区域的底部行显示状态信息。这些信息包括:错误消息、删除和添加的文本块信息、文件状态信息。此外,vim在状态行还将显示最后一行模式下的命令。

② 重绘屏幕

有时屏幕会被扭曲或者重写;有时vim在屏幕上显示字符时,会在行上显示@而不是删除一行;当某个程序的输出与工作缓冲区的内容混在一起时,就会出现一些麻烦,这些输出虽然不会添加到工作缓冲区,但是它们会影响显示结果。如果出现这些情况,请按下Esc键将vim切换到命令模式,再按下Ctrl+L来重绘(刷新)屏幕。

③ 代字符(~)

当屏幕显示到文件的末尾时,vim将在文件最后一行的下一行的最左端显示一个代
字符㈩。当开始编辑一个新的文件时,vim使用该符号标识每一行(除第1行外)的开始。


输入模式下校正文本

当vim处于输入模式时,使用删除键、行删除键和Ctrl+W组合键可以删除错误的文本,然后再插入正确的新内容,这样便完成了文本的校正工作。


工作缓冲区

vim在工作缓冲区中进行所有的工作。启动编辑会话时,vim将要编辑的文件从磁盘读入工作缓冲区;在会话过程中,vim将所做的修改保存在缓冲区中而不修改磁盘上的文件,直到将工作缓冲区内容写回到磁盘。一般情况下,结束编辑会话时,都要用到将工作缓冲区的内容写回磁盘的vim命令,这样才能使本次所做修改得以保存。当编辑一个新文件时,vim创建该文件,通常在结束编辑会话时,将工作缓冲区的内容写回磁盘。

将编辑的文本放置在工作缓冲区既有好处也有缺点。好处在于当不想保存所做修改时,用户可以不将工作缓冲区的内容写回磁盘;缺点在于若在退出会话时忘记将缓冲区内容写回磁盘,那么,用户将丢失所有的修改工作。

如果只想使用vim浏览文件而不修改文件,可以使用工具view,如下所示:

$ view filename

调用view工具与调用带-R(readonly)选项的vim编辑器产生的效果相同。若以此种产生的效果是不同的。如果不注意,可能会使vim给出“错误的”回应。

方式启动编辑器,那么将不能把工作缓冲区的内容写回到磁盘上的原文件中,但可以写到另一个文件中。


行长度与文件大小

vim本身对单独“一行”(两个换行符之间的字符)的长度没有限制,仅受限于可用内存容量,因此vim可以操作任何格式的文件。文件的总长度受限于可获得的磁盘和内存空间。


窗口

vim允许打开、关闭和隐藏多个窗口,可以分别用于编辑不同的文件。多数窗口命令由Ctrl+W后跟某个字母组成。例如,Ctrl+W s(split,分割)打开另一个窗口来编辑同一个文件;Ctrl+W n打开一个窗口编辑一个空文件;Ctrl+W w将光标在窗口间移动;Ctrl+W q(或者:q)退出(关闭)窗口。输入命令:help windows可显示窗口命令的完整列表。


锁定文件

当编辑一个已有文件时,vim将显示该文件的前面部分内容,在状态行给出文件的状态信息,并将文件锁定。如果使用vim打开一个已经锁定的文件,那么,vim将显示如图10-7所示的消息。在两种情况下,用户会遇到此类消息。一种情况是,用户要编辑的文件可能另一个人正在编辑(也许当前用户正在另一个窗口或终端对该文件进行编辑);另一种情况是,您上次使用vim编辑此文件时系统被非正常地关闭。





可以按照vim所显示的指令去做,但也可以编辑该文件,然后将它写到一个具有不同名字的文件中去。更多信息参考下面一节。


非正常结束编辑会话

可以采用两种方式结束编辑会话:一种是保存编辑会话过程中所做修改;一种是放弃编辑会话过程中所做修改。在命令模式下,使用命令ZZ或者:wq可以将所做修改保存后退出。

如果不想保存所做修改直接结束编辑会话,那么可以使用命令 :q!

当使用这个命令结束编辑会话时,vim将不保存工作缓冲区内容,这将丢失用户自上次写回磁盘后所进行的工作。下一次编辑和使用文件时,文件内容为上一次工作缓冲区写回磁盘的内容。请谨慎使用命令 :q! 。

有时会遇到不能从vim创建或者编辑的文件中退出。例如,当调用vim时忘记指定文件名,那么可使用ZZ命令退出,会看到No file name的消息。如果不能从vim中正常退出,那么在退出vim之前,可以使用命令 :w将所做修改写到磁盘文件。输入下面的命令,其中的filename为文件名(命令输入完毕后要按Enter键):

:w filename

在写命令结束后,可以使用 :q退出vim。此时不必使用叹号(即不必输入q!)。因为它仅适用于自上次将工作缓冲区内容写回磁盘又做了修改的情况。关于w命令稍后会介绍。


不能写文件的情况
=======================================================================
提示: 当用户不具有某个文件的写权限时,使用命令:w filename是很有必要的。如果使用命令ZZ,用户将会看到filename is read only(文件只读)的消息,说明用户对该文件不具有写权限。这时可以使用w命令将文件写到具有不同文件名的临时文件中。如果用户对工作目录不具有写权限,那么,vim将仍不能把文件写回磁盘。

这时可以使用w命令和文件的绝对路径名。例如,Yangjie可以使用命令:w /home/yangjie/temp或者:w ~/temp。

如果vim报告File exists(文件存在),那么,可以使用:w! filename来重写该文件(要谨慎)。
=======================================================================

崩溃后的文本恢复

vim会将操作的交换文件临时存储起来。当使用vim编辑文件时,如果系统突然崩溃了,那么再次启动系统后,可以根据这些交换文件对文件进行恢复。当所编辑的文件具有交换文件时,用户会看到类似于图10-7所示的消息。如果有其他人正在编辑该文件,那么请退出并以只读方式打开文件。

Yangjie在编辑文件memo时系统崩溃,当再一次登录到系统,他使用下面的命令来检查是否存在文件memo的交换文件。

$vim -r
Swap files found:
In current directory:
1. .memo.swp
dated:Wen May 16 13:16:06 2007
owned by:yangjie
file name:~yangjie/memo
host name:linuxunion.net
user name:yangjie
process ID:19786
In directory ~/tmp:
- - none - -
In directory /var/tmp:
- - none - -
In directory /tmp:
- - none - -


带-r选项的vim会显示所有已保存的交换文件(有些可能是以前的文件)。如果已经保存了所做工作,那么可输入命令vim -r后跟文件名,这样就可以编辑工作缓冲区最近的副本。尽快使用命令:w filename将工作缓冲区的应急副本写到磁盘上,给文件命名一个与原来文件不同的名字。然后,检查是否可以恢复文件。下面是Yangjie在恢复文件memo时,与vim的交互操作,最后他删除了memo的交换文件。

$ vim -r memo
Using swap file “.memo.swp”
Original file “~/memo”
Recovery completed.You should check if everything is OK.
(You might want to write out this file under another name
and run diff with the original file to check for changes)
Delete the .swp file afterwards.

Hit ENTER or type command to continue
:w memo2
:q
$ rm .memo.swp


必须在文件编辑时崩溃的系统上恢复文件
=======================================================================
提示: vim的恢复特性是与崩溃的系统相关的。如果您正运行在一个群(cluster)中,那么您必须重新启动刚才崩溃的系统使用 -r选项进行恢复工作。
=======================================================================

命令模式下移动光标

当vim处于命令模式下,可以将光标定位到屏幕上的任何字符,也可以将工作缓冲区的不同部分显示在屏幕上。通过控制屏幕和光标的位置,可以将光标定位到工作缓冲区中的任何字符。

可以在文本中前后地移动光标。如图10-8所示,向前是指往屏幕的右侧和底部移动,向后是指往屏幕的左侧和上部移动,一直到达文件的开始。当使用命令将光标移到某行的末尾(右端)时,再往前移动,则光标就被移到下一行的开始。当光标移到某行的开始(左端)时,再往后移动,则光标就被移到上一行的末尾。





长行 有时工作缓冲区的一行太长不能在屏幕的一行上显示,vim将自动换行到下一行显示(除非设置了nowrap选项)。

也可以跨越不同的度量单位(字符、字、句子、段落或者一屏)来移动光标。移动光标的命令前面带上的数字称为重复因子,光标跨越单元的个数将根据该数字确定。关于这些内容的准确定义稍后我们会介绍。


按字符移动光标

I/h 空格键、I(小写的“I”)键和方向键中的右移键(如图10-9所示)都可以将光标往前(右)移动,每次移动一个字符,一直到达屏幕的右端。命令“7SPACE”或者“7I”可以将光标右移7个字符。这些键不能将光标从当前行的末尾移到下一行的开始。h键和方向键中的左移键与I键工作方式类似,只是方向相反。




将光标移到某个特定字符

f/F 使用查找命令可以将光标从当前行的某个指定字符移到该字符下一次出现的位置。例如,下面的命令将光标从当前字符a位置移到同一行上a的下一次出现(如果该行后面有一个a出现)的位置:

fa

使用大写字母F可以移到前一次出现。如下所示,该命令将光标从当前字符a的位置移到同一行上a的前一次出现的位置:

Fa

分号 (;)可以重复上一次的查找命令。


按字移动光标

w/W w(word,字)键将把光标向前移到下一个字的第1个字母(如图10-10所示)。标点符号也被看作一个字。如果下一字位于下一行,那么该命令可以将光标移到下一行。命令15w将把光标移到后面第15个字的首字符处。





W 键与 w很类似,也是往前移动光标,只是 W 键按照空白分隔字(包括标点符号)来移动光标。

b/B b(back)键将光标向后移到前一个字的开始字母。B 键按照空白分隔字向后移动光标。类似地,e键将把光标移到下一个字的末尾字符;E键将把光标移到下一个空白分隔字的末尾。


按行移动光标

j/k Enter键可以将光标移到下一行的开始处;j 键和方向键的向下键将把光标移到当前字符正下方的字符处(如图10-ll所示),如果当前字符下面没有字符,那么光标将移到下一行的末尾。光标不会越过工作缓冲区的文本的最后一行。





按行移动光标

k键和方向键中的向上键与j键的工作过程类似,只是方向相反。减号(-)键与Enter键类似只是方向相反。


按句子和段落移动光标

)/ (和}/{ ) 和}可分别将光标向前移到下一个句子的开始和下一个段落的开始,如图10-12所示。(和{可分别将光标向后移到前一个句子的开始和前一个段落的开始。关于句子和段落的更多信息稍后有详细的介绍。






在屏幕内移动光标

H/M/L H(home)键将光标定位到屏幕顶部一行的最左端处;M(middle)键将光标定位到屏幕的中间一行;L(lower)键将光标定位到屏幕的底部一行,如图10-12所示。

浏览工作缓冲区的不同部分

屏幕上显示了文本在工作缓冲区的某一部分,通过滚动可显示文本的前面和后面部分,也可以基于行号来显示工作缓冲区的内容。

Ctrl+D组合键和Ctrl+U组合键按下Ctrl+D组合键可将屏幕向下(前)滚动,显示半屏新文本;按下Ctrl+U组合键可将屏幕向上(后)滚动,同样显示半屏新文本。在这些命令前加入数字,则在后面的会话过程中,每次使用Ctrl+D组合键或者Ctrl+U组合键都会按照该数字指定的行数滚动屏幕,直到再次修改滚动行数。

Ctrl+F组合键和Ctrl+B组合键Ctrl+F组合键(forward,向前)和Ctrl+B组合键(backward,向后)是显示一屏新文本,为了保持连续性,保留前面一屏的两行。有些键盘可以使用PAGE DOWN和PAGE UP来替代Ctrl+F组合键和Ctrl+B组合键。


行号(G)输入命令G后跟数字,vim将把光标定位到工作缓冲区的对应行。如果G后没有数字,那么,vim将把光标移到工作缓冲区的最后一行。行号不必显式给出,即文件没有行号该命令也能照常工作。使vim显示行号的内容参见下面的附表10-7中“行号”一行。


输入模式

插入命令、添加命令、修改命令和替换命令都可以将vim切换到输入模式。当vim处于输入模式时,就可以向工作缓冲区中输入新文本内容。在文本的输入完成后,可按下Esc键返回到vim的命令模式。为了使vim在处于输入模式时给用户提示,可参见附表10-7中“显示模式”一行(默认情况下)。

插入文本

插入(i/I) i(Insert, 插入)命令使vim进入输入模式,可以在光标所在字符(又称为当前字符)之前插入文本。I命令是在当前行的开始处插入文本(如图10-13所示)。命令i和I有时会覆盖屏幕上的文本,但在工作缓冲区中字符是不会被覆盖的,只是显示受到了影响。按下Esc键进入命令模式,被覆盖的文本会再次显示出来。使用i或者I可以向已有文件或者新文件中插入新的字符和字。






添加文本

添加(a/A) 命令(Append,添加)与命令i类似,命令a是在当前字符之后添加文本(如图10-13所示)。命令A是在当前行的最后一个字符后添加文本。


为输入文本打开行

打开(o/O) 命令o(Open,打开)和O是在当前文本中打开一个空白行,将光标放置在新(空白)行的开始处,并使vim进入输入模式。命令O在当前行的上面打开一行,命令。在当前行的下面打开一行,使用这些打开命令可以在已有文本中输入多行。


文本替换

替换(r/R) 命令r(Replace,替换)和R使得新输入文本覆盖(替换)已有文本。命令r后跟某个字符将替换掉当前字符。在输入该字符后,不必输入Esc键,vim会自动返回到命令模式。

命令R将替换所有后续字符直到按下Esc键退回到vim的命令模式。


替换TAB
=======================================================================
提示:当使用替换命令来替换TAB时,您会觉得有点奇怪。在替换TAB之前,TAB字符显示为几个空格。事实上,这些空格在替换时将被看作一个字符进行替换。关于如何把TAB作为不可见字符显示的内容参见表10-7中“不可见字符”一行。


输入模式下转义特殊字符

Ctrl+V在输入模式下,使用转义命令Ctrl+V便可向文本中输入任何字符,包括通常情况下那些对vim具有特殊意义的字符。这些字符有:Ctrl+L或者Ctrl+R(重绘屏幕) Ctrl+W(删除字)和Esc键(进入命令模式)。

为了将上述字符插入到文本中,可以在输入它们之前输入Ctrl+V。Ctrl+V可以将其后跟的单个字符转义。例如,为了将Esc[2J插入到vim正在编辑的文件中,可以输入字符序列Ctrl+V Esc[2J。此字符序列可以实现对类似DEC VT-100的终端的清屏功能。通常情况下,用户可能不会把该字符序列输入到文档中。但在使用vim编写shell脚本时,就可能用到这个字符序列或者其他的Esc序列。更多关于shell脚本的内容参稍后的介绍。

命令模式下删除和修改文本

本节描述了对编辑文本进行删除和修改的命令,同时介绍了撤销命令,该命令可以对文本的删除和修改进行恢复。


撤销修改

撤销(u/U) 命令u(Undo,撤销)可以将错误删除或修改的文本恢复。执行一次撤销命令只能撤销上一次对文本的操作。如果删除一行后又修改了某个字,那么,执行一次撤销命令后,只能恢复被修改的字。为了恢复被删除的行,必须再执行一次撤销命令。命令u只能对修改的最后一行内容进行恢复,将其恢复到启动修改之前的状态,即使期间进行了很多修改。


删除字符

删除字符(×/X) 命令x可以删除当前字符。在命令x前使用重复因子可以删除当前行上从当前字符开始的后续多个字符。命令X删除光标左边的字符。


删除文本

删除(d/D) 命令d(Delete,删除)将把文本从工作缓冲区中删除。命令d删除文本的多少取决于d后重复因子和度量单位的设定。文本删除后,vim仍处于命令模式。


使用dd删除一行
提示:命令d Enter 将删除两行:当前行和下一行。dd仅删除当前行,在dd前加入重复因子可以删除多行。

也可以从当前光标位置删除到同一行上的某个特定字符。例如,命令dt可以删除到下一个分号(;) (关于命令t的更多信息参考稍后的章节) 命令D或者d$可以删除当前行上从光标开始后的内容。附表10-1列出了一些删除命令,其中dd命令之前的所有命令都是从当前字符开始删除或者删除到当前字符结束。





字符和行的交换
=======================================================================
提示:如果相邻两个字符的顺序错误,那么,可以将光标放置在第1个字符,输入命令xp即可将两个字符交换;如果相邻两行的顺序错误,那么,可以将光标放置在第1行,然后输入命令ddp即可将两行交换。关于Put命令的更多信息稍后介绍。



修改文本

修改(c/C) 命令c(change,修改)可以将旧文本替换为新文本,其中新文本不一定与旧文本占据相同的空间。如可以将某个单词替换为几个单词,或者一个段落,或者一个字符。命令C是从光标位置替换到行的末尾。

命令c删除文本的多少取决于重复因子和度量单位的设定,它可以使vim进入输入模式。当新文本输入完毕时,按下Esc键,以前的字、行、句子或者段落将被替换为新的文本。如果删除指定文本后没有输入新内容就按下了Esc键,那么,该操作就相当于只是删除了指定文本。

附表10-2列出了一些修改命令。除最后两行外,每个命令都是从当前字符开始删除或者删除到当前字符结束的。





dw与cw工作方式不同

提示::命令dw删除包括字末尾处空格在内的所有字符;而命令cw仅改变字中的字符,保留字后的空格。


替换文本

替换(s/S) 命令s和S(Substitute,替换)也可以将旧文本替换为新文本(如附表10-3所示)。命令s删除光标所在字符,使vim进入输入模式,然后可输入新内容直到按下Esc键,vim将一个字符替换为了刚刚输入的新内容。命令S与命令cc相同,可以修改当前行。命令s只替换当前行的字符。若在命令s前指定的重复因子要替换的个数超出了当前行,那么命令s只能修改到行的末尾(与命令C相同)。





修改大小写

代字符(~)命令可以改变光标所在字符的大小写,从大写改为小写或者从小写改为大写。可以在代字符前加入数字来说明要修改大小写的字符个数。例如,5~将改变从当前光标所在字符开始的5个字符的大小写。如果修改到达光标所在行的末尾,那么,修改将结束。


查找和替换

任何编辑器都具有的一个关键特性是:通过与正则表达式的匹配实现字符、字符串或者文本的查找和替换。vim编辑器为在当前行上查找字符提供了较简单的命令,同时也为在工作缓冲区中,查找和选择性地替换字符串或正则表达式的单次或多次出现,提供了较复杂的命令。


查找字符

查找(f/F) 命令f(Find,查找)可以在当前行查找指定字符,并将光标移到该字符的下一次出现的位置。

t/T t和T与查找命令具有相同的使用方式。命令t将光标定位在指定字符下一次出现的前一个字符的位置;命令T将光标定位在指定字符前一次出现的后一个字符的位置。

分号(;)将重复执行最后一个f、F、t或者T命令。

查找命令可以与其他命令合并到一起使用。例如,命令d2fq可以删除当前行在光标后第2次出现的字母表。


查找字符串

vim编辑器可以在整个工作缓冲区中查找与正则表达式匹配的文本或字符串。斜杠(/ )后跟要查找的文本(称为搜索字符串)按下Enter键便开始搜索(向前搜索)字符串下一次出现的位置。vim将在状态行显示输入的斜杠和要查找的字符串,按下Enter键后,vim便开始对字符串进行搜索。如果搜索成功,vim将把光标移到该字符串的首字符。如果用问号(?)来替代斜杠,那么vim将查找字符串的前一次出现的位置。

如果要向前搜索斜杠字符或者向后搜索问号字符,需要在它们前面加上反斜杠(\)以实现
转义。


两种不同的转义字符的方法
提示:在编辑文本时,可以使用Ctrl+V转义特殊字符。本节讨论了在搜索字符串中使用反斜杠(\)转义特殊字符。这两种转义字符的方法是不可互换的。


键N和n在不必再输入搜索字符串的情况下,将重复上一次搜索。键n的搜索与上一次的搜索完全相同,而键N则以相反的方向重复上一次的搜索。

如果vim在向前搜索时,搜索到工作缓冲区的末尾仍没有找到字符串,那么,vim会折回到工作缓冲区的开始继续搜索。同样,在向后搜索时,如果搜索到工作缓冲区的开始还没有找到字符串,vim会折回到工作缓冲区的末尾再继续搜索。vim还支持区分大小写形式的搜索。更多关于如何修改搜索参数的内容参见表10-7中“循环扫描”和“忽略大小写搜索”两行。

⒈ 普通搜索与增量搜索

当vim进行普通搜索(默认情况下)时,输入斜杠或者问号后跟搜索字符串,按下Enter键,vim便开始搜索并将光标移到搜索字符串的下一次或者前一次出现的位置。

当vim进行增量搜索时,输入斜杠或者问号后,随着搜索字符串的输入,vim将突出显示已输入字符串的下一次或者前一次出现的位置。当突出显示的字符串恰是要查找的字符串时,按下Enter后即可将光标移到突出显示的字符串的位置。如果没有任何文本与输入字符串匹配,那么vim将不突出显示任何字符。

vim搜索的类型取决于参数incsearch的设置。输入命令:set incsearch可以将增量搜索打开。设置参数noincsearch可将增量搜索关闭。当设置compatible参数时,vim也会关闭增量搜索。

⒉ 搜索字符串中的特殊字符

由于搜索字符串是正则表达式,所以搜索字符串中的一些字符具有特殊的意义。下面的段落列出了其中的一些特殊字符。

在下面的列表中,首先介绍字符^和$。除非在^和$前面加入反斜杠(\),否则它们两个在搜索字符串中将具有特殊的意义。除了这两个特殊字符外,列表中其他字符的特殊意义可以通过设置nomagic参数关闭。更多信息参见表10-7中的“允许搜索特殊字符串”行。


(1) ^(行开始指示符)

当脱字符 (^,又称为音调符)作为搜索字符串的第1个字符时,vim将每行的开始字符串与搜索字符串进行匹配。例如,命令/^$是向下搜索以the开始的行。


(2)$(行结束指示符)

美元符号($)与行的结束匹配。例如,命令/!$是查找以叹号结尾的下一行,命令/$将查找以空格结尾的下一行。


(3) .(任意字符指示符)

句点(.)可以与任何字符匹配,它可以出现在搜索字符串的任意位置。例如命令/1..e可以查找到任何包含l后跟任意两个字符和e的字符串,如line、followed、like、include和all memory。要查找句点,可以使用反斜杠进行转义(\.)。


(4)\>(字结束指示符)

这两个字符与字的末尾匹配。例如,命令/s\>查找下一个以s结尾的字。通常情况下,反斜杠(\)用来关闭字符特殊意义,而单独的>没有特殊意义,所以这里的反斜杠不是用来转义的。字符序列\>具有特殊意义。


(5)\<(字开始指示符)

这两个字符与字的开始匹配。例如命令A
(6) *(0个或多个出现)

这个字符是一个修饰符,它与某个字符的0次或者多次出现相匹配。例如,命令/dis*m将与以di后跟0个或者多个s和一个m的字符串匹配,如dim、dism和dissm。


(7) [] (定义字符类)

方括号将两个或者多个字符括起来与括号内的单个字符匹配。例如,命令/dis[ck]查找disk或者disc的下一次出现的位置。

在定义字符类中,有两个特殊的字符:脱字符(^)和连字符(-)。脱字符为左括号后的第1个字符时,定义了一类除后面字符的其他字符。连字符放置在两个字符之间表示字符范围。参见附表10-4中的示例。





字符串的替换

替换命令合并了查找命令和修改命令的功能。替换命令将首先查找某个字符串(或正则表达式),与命令/的功能相同,允许查找前面一节讨论的特殊字符;当找到与匹配的字符串时,替换命令就来修改该字符串。替换命令的语法格式:

:[g] [address] s/search-string/replacement-string[/option]


像所有以冒号开始的命令一样,vim也是在状态行执行替换命令的。

1.address的设定

如果替换命令中不指明address(地址),那么,替换命令将仅搜索当前行;如果使用某个行号作为address,那么,替换命令将搜索对应行。如果address是以逗号隔开的两个行号,那么,替换命令将搜索这两行和它们之间的行。要在vim中显示行号可参见附表10-7中的“行号”。也可以使用斜杠括起来的字符串作为address(该字符串称为地址字符串),vim将对包含地址字符串的下一行进行查找和替换。如果在地址字符串之前带上字母g(global,全局),那么vim将对包含地址字符串的所有行进行查找和替换。(这里的g与放置在替换命令末尾的g不同,放置在末尾的g是在某行进行多个替换,参见下面的“查找并替换字符串”一节。)

address中的句点代表当前行,美元符号代表工作缓冲区中的最后一行,百分号代表整个工作缓冲区。也可以使用加减号进行address的算术运算。附表10-5给出了address的一些示例。





2.查找并替换字符串

在替换命令的语法格式中,address后的s表明命令是一个替换命令。s后的分隔符标志着search-string的开始。本文示例中使用斜杠作为分隔符,也可以使用除字母、数字、空白符和反斜杠之外的其他字符,但要注意位于search-string的前后的分隔符是相同的。

search-string的格式与命令/中搜索字符串的格式相同,也可以包含同样的特殊字符。(search-string是正则表达式,更多信息参见附录A。)用分隔符标志search-string的结束同时也标志replace-string的开始。

replace-string用来替换匹配的search-string,它的后面应该跟一个分隔符。如果replace-string后没有选项,那么可以省略最后的分隔符,如果存在选项就加上最后的分隔符。


search-string中的一些字符具有特殊意义,而replace-string中的某些字符也同样具有特殊意义。例如,与符号(&)在replace-string中代表与search-string匹配的文本;反斜杠在replace-string中用来转义其后面的字符。参见附表10-6和附录A。





通常情况下,替换命令只替换第1次出现的与search-string相匹配的字符串。如果要进行全局替换,或者说,要替换文本中的所有匹配的字符串,那么,可以在replace-string的末尾分隔符之后追加g(global,全局)选项。vim的选项c用来询问是否修改每个与search-string匹配的字符串,按下y键将替换search-string,按下q键则终止命令。按下l(1ast,最后)键进行替换并退出,按下a(all,所有)键将所有剩余的匹配字符串替换,按下n键将不进行替换继续搜索。

地址字符串不必与search-string相同,例如:

:/candle/s/wick/flame/

这个示例是将下一行上第1次出现的包含candle的字符串替换为name。又如:

:g/candle/s/wick/flame/

这个示例将文件中每一行上第1次出现的包含candle的字符串替换为wick。而下面的示例:

:g/candle/s/wick/flame/g

这个示例是将文件中每一行上所有包含candle的字符串都替换为wick。

如果search-sting与address相同,那么,可以让search-string空着。例如,命令:/candle/s//lamp/与命令:/candle/s/candle/lamp/是等价的。


其他命令

本节将介绍3个命令,将这些命令归到任何一组都不适合。


◎ 连接命令

连接(J) 命令J(Join,连接)将当前行的末尾与下一行连接起来,在两行之间插入一个空格,并将光标定位到空格。如果当前行以句点结束,那么,vim将插入两个空格。

如果想将某行分成两行,那么,可以在要断开的地方按下Enter键来替换空格。


◎ 状态命令

状态(Ctrl+G) 状态命令Ctrl+G将显示正在编辑中的文件的名字和相关信息,其中包括:文件修改时间、文件在工作缓冲区中的总行数、当前行之前部分占整个工作缓冲区内容的百分比、当前行的行号和当前光标所指向的字符的位置。也可以使用命令:f来显示状态信息,下面为状态行的示例:

“termcap” 17103 lines - -3%- - 569,1 3%


◎ (句点)

命令.(句点)将重复执行最近一次的修改命令。例如,如果刚刚执行了命令d2w(删除后续的两个字),那么命令.将继续向前删除接下来的两个字;如果刚刚插入了文本,那么命令.将继续插入相同的文本。对于要修改工作缓冲区中的某个字或者短语的多次出现,这个命令将非常有用。使用斜杠(/)查找第1次出现的字,然后使用cw修改该字,使用n可搜索下一次出现的该字,命令.将进行与上次同样的修改。如果不想修改,那么,可以使用n继续查找下一次出现的位置。


命令Yank、Put和Delete

vim编辑器具有一个通用缓冲区和26个命名缓冲区,可用这些缓冲区来存放编辑会话过程中的文本。这些缓冲区对文本块的移动和复制非常有用。将Delete命令和Put命令联合起来使用可以将工作缓冲区中的某段文本从某个位置移到另一个位置。Yank命令和Put命令联合起来可以将某段文本复制到工作缓冲区的另一个位置,其中,原来的文本将不会改变。

通用缓冲区

vim编辑器将最近修改(包括修改、删除和移出操作)的文本在通用缓冲区中存储起来。撤销命令将从通用缓冲区取出文本并对其进行恢复操作。


⒈将文本复制到缓冲区

Yank(y/Y)命令Yank(y)与Delete命令(d)很类似,只是它不从工作缓冲区中删除文本。vim将要移出的文本复制到通用缓冲区,当使用Put命令时,将把文本复制到工作缓冲区的另一位置。使用Yank命令与使用Delete命令的方法相同。命令Y(大写字母)将把整行移出到通用缓冲区。

yy可以移出一行
=======================================================================
提示:命令d Enter删除两行,命令y Enter将移出两行。命令dd删除当前行,而命令yy将移出当前行。



命令D与命令Y的工作方式不同
=======================================================================
提示:命令D与命令Y的工作方式不同。命令D是从光标处删除到行的末尾,而命令Y无论光标在哪都是移出整行。


⒉从缓冲区中复制文本

Put(p/P)Put命令(p和P)将把文本从通用缓冲区复制到工作缓冲区。当字符和字删除或移出到通用缓冲区后,命令p可以把它们插入到当前字符之后,命令P则把它们插入到当前字符之前。如果删除或移出行、句子或段落,命令P将把这些内容插入到通用缓冲区光标所在行之前,命令p是插入到光标所在行之后。

Put命令并不改变通用缓冲区中Put的内容。因此,使用一个Delete或Yank命令将文本放置到通用缓冲区后,可以使用多次Put命令将该文本放置在工作缓冲区的不同位置。


⒊将删除文本复制到缓冲区

前面介绍的所有Delete命令都将删除文本放置在通用缓冲区中,这样就可以在执行撤销命令时恢复删除的文本,也可以将删除的文本使用Put命令放置到工作缓冲区的另一个位置。

例如,使用dw命令将某个字从句子的中间删除,将光标移到某两个字的空格处,执行命令p,则vim将把刚才删除的字放到该空格处。又如,使用dd命令将某行删除,把光标移到要放置删除行的下一行,执行命令P,则vim将把刚才删除的行放置到光标所在行的上一行。





● 文件的读写

退出(ZZ)如果在调用vim的命令行上指明文件名,那么,vim编辑器将把文件从磁盘读入到工作缓冲区。命令ZZ可以终止编辑会话,并将工作缓冲区的内容写回到磁盘文件。本节将讨论从工作缓冲区读文本和向磁盘写文件的其他方法。


● 读文件

读(:r)读命令是将文件读入到工作缓冲区。新创建的文件并不覆盖工作缓冲区中的任何文本,而是被定位到命令中指定的地址之后(如果没有指定地址,那么就定位到当前行)。使用地址0可以将文件读入到工作缓冲区的开始位置。读命令具有下面的语法格式:

: [address] r [filename]

像其他以冒号开始的命令一样,当输入冒号后vim会将其显示在状态行。filename是要读入文件的路径名,如果省略了filename,那么vim将从磁盘读入文件进行编辑。命令输入完毕,必须按下Enter键该命令才能执行。


● 写文件

写(:w)写命令可以将工作缓冲区的部分或者全部内容写到文件。使用地址可以将工作缓冲区的部分内容写回到由文件名指定的文件中。如果不指定地址和文件,那么,vim将把整个工作缓冲区的内容写回到正在编辑的文件,并更新磁盘上的文件。

在一个较长时间的编辑会话中,建议用户经常执行写命令,这样可以使得当系统出现问题时,工作缓冲区的最近副本在磁盘上有备份。使用命令:q!退出vim时,磁盘文件将为上一次使用写命令时工作缓冲区的内容。写命令有两种格式:

:[address]w [!] [filename]
:[address]w>>filename


第2种格式是向已有文件追加文本。其中,address指定了要把缓冲区的哪部分写回文件。这里的address格式与替换命令中的address格式相同。如果不指定address,那么,vim将把整个缓冲区内容写回。选项filename是要写回文件的路径名,如果不指定filename,那么,vim将写回到正在编辑的文件。

w! 由于写命令的执行会在瞬间“破坏”大量工作,所以为了避免意外地重写文件,vim要求在w之后输入叹号(!)。下面的情况不必输入叹号:将整个工作缓冲区内容写回正在编辑的文件(省略address和filename);将工作缓冲区的部分或者全部内容写回到一个新文件。若要将工作缓冲区的部分或者全部内容写回到正在编辑的文件,或者要重写另一个文件,必须使用叹号。

● 识别当前文件

文件命令(:f)与状态命令(Ctrl+G)提供了相同的信息。文件命令显示的文件名为不带文件名的命令 :w执行时要写的文件名。


● 参数设置

通过设置vim参数可以定制vim,使其更符合自己的需要和习惯。参数能完成的功能如显示行号、自动回车换行、进行增量搜索或者非标准搜索等。设置参数有多种方式。例如,使用vim时设置参数,为当前编辑会话建立环境;或者,在shell初始化文件~/.bash_profile(bash)或~/.1ogin(tcsh)中设置参数;也可以在vim的初始化文件~/.vimrc中设置参数。当在这些文件中设置参数后,每次启动vim,环境便建立起来,可以直接进行编辑。


● 在vim中设置参数

当使用vim时要设置参数,可输入命令 :set parameter_name,其中parameter_name为参数名。该命令随着用户的输入将显示在状态行,按下Enter键即可执行命令。下面的命令是为当前编辑会话设置增量搜索:

:set incsearch

● 在初始化文件中设置参数

VIMINIT如果用户使用的是bash,那么可以在用户的初始化文件~/.bash_profile中
输入下面格式的语句:

export VIMINIT=‘set param1 param2’

从附表10-7中选择参数来替换paraml和param2。VIMINIT是vim要读的shell变量。下面的语句使得搜索忽略大小写、显示行号、使用TC Shell来执行Linux命令并从距离屏幕的右边缘的15个字符处自动换行显示文本。

export VIMINIT=‘set autoindent number shell=/bin/tcsh wrapmargin=l 5’

这条语句可简写为:

export VIMINIT=‘set ai nu sh=/bin/tcsh wm=15’

如果用户用的是tcsh,那么在初始化文件~/.tcshrc中可输入下面的语句:

setenv VIMINIT ‘set param2 param2…’

同样,用表6-7中的参数替换paraml和param2。单引号中参数的值与前面示例中的值相同。


● vimrc初始化文件

如果不在shell初始化文件中设置vim参数,那么,用户也可以在自己的主目录下创建文件~/.vimrc,可在该文件中设置参数。如果创建了文件.vimrc,vim在启动时就不设置compatible参数。文件 .vimrc中的语句格式如下所示:

set paraml param9 ...

下面示例完成的功能与前面描述的VIMINIT的功能相同。

$cat ~/.vimrc
set ignorecase
set number
set shell=/bin/tcsh
set wrapmarg-in=15
$cat ~/.vimrc
set ic nu sh=/bin/tcsh wm=15

在VIMINIT中设置的变量值优先于在文件 .vimrc中设置的值。

● 参数

附表10-7列出了vim中非常有用的参数。输入命令:set all后按Enter键,编辑器vim将显示参数的完整列表,并给出它们当前的值。输入命令:set后按Enter键可显示选项列表,其中选项的值并非它们的默认值。参数可以分为两类:用等号(=)赋值的参数和带或不带前缀no的参数(分别表示关闭或者打开)。使用命令:set[no]param可以将第2类参数打开或关闭。例如,命令:set number将显示行号,而命令:set nonumber将不显示行号。对于第1类参数使用等号赋值,例如命令:set shiftwidth=15。

多数参数都有简写形式,如number简写为nu,nonumber简写为nonu,shiftwidth简写为sw。在附表10-7的最左面一列中,每个参数名的后面为其对应的简写符。






● 高级编辑技巧
在对vim有些了解后,再来学习本节介绍的这些命令,用户会发现非常有用。






● 在vim中执行sheIl命令

在使用vim时,执行shell命令有多种方式。输入下面的命令后按Enter键后即可派生一个新的交互式shell:
:sh

参数shell用来确定派生哪个shell(通常为bash和tcsh)。默认情况下,shell为登录shell。

执行完shell任务后,可以通过退出shell返回到vim(通常按下Ctrl+D组合键或者执行命令exit)。


如果:sh不能正常工作
=======================================================================
提示- 命令:sh的执行与shell的设置有关。使用命令:sh时可能会遇到警告,或者命令被挂起。在用命令:sh进行试验时,要确保shell是在用户的设置下工作的。如果没有,那么在使用:sh前可能需要将shell参数设置为另一个shell。例如,下面的命令使得vim的命令:sh使用tcsh:
:set shell=/bin/tcsh

在执行命令:sh后,为了显示正确的shell,可能还需要改变SHELL环境变量。
=======================================================================


只能编辑文件的一个副本
警告 - 当使用:sh创建一个新shell时,要确保用户还在使用vim。常见的错误是用新的shell对另一个shell使用vim正编辑的文件进行编辑,这样使用两个编辑窗口编辑同一个文件可能会造成信息丢失。

输入下面的命令,可以在vim中执行shell命令行。其中,command为要执行的命令行,按下Enter键结束输入,开始命令行的执行。

:!command

vim编辑器派生一个新的shell来执行command。当command执行完毕,新派生的shell将返回到编辑器的控制。

也可以在vim中执行命令,用命令的输出来替换正在编辑文件的当前行的文本。如果不想替换任何文本,那么,在执行下面的命令前,首先将光标移到空白行。

!!command

当输入其中的第1个叹号时,任何事情都不会发生。当输入第2个叹号时,vim将把光标移到状态行,等待输入要执行的命令。由于此命令使vim处于最后一行模式,因此,要用Enter键结束命令(就如结束大多数的shell命令一样)。

在vim执行命令时,标准输入来自于正编辑文件的部分或者全部内容,标准输出将作为正编辑文件的输入。使用这一类型的命令可以对文件的内容进行排序。

为了将某块文本指定为命令的标准输入,可以首先将光标移到文本的一端,然后输入叹号和把光标移到文本另一端的命令。例如,要指定整个文件,可以将光标定位到文件的开始,然后输入命令!G;要指定从光标当前位置到标记行b,可以输入命令 !´b。在输入这些光标移动命令之后,vim将在状态行显示一个叹号,等待shell命令的输入。

为了将文件中的名字列表排序,可以首先将光标移到列表的开始,然后使用命令mq设置标记q,再将光标移到列表末尾,输入下面的命令:
! ´sort

按下Enter键等待几秒钟后,排序后的列表将替换原来的列表显示在屏幕上。如果命令执行的结果不是用户所期望的,那么可以使用命令u撤销刚才所做的修改。


!可能会覆盖文件
=======================================================================
警告: 如果执行了错误的命令,那么,正在编辑的文件会受到影响(例如,有些命令可能会将vim 从工作状态挂起或者终止)。基于这个原因,建议用户在执行命令前首先保存文件。也可以用撤销命令撤销操作;命令:e!也可以撤销所做修改将缓冲区恢复到上一次保存的状态。

使用命令:sh时,默认情况下的shell也许不能正常使用!命令。用户可以在使用这些命令进行真正的工作之前,对一个简单的文件进行测试。如果shell不能正常工作,那么,请修改shell参数。

● 度量单位

vim的许多命令都是在文本块上进行操作的。文本块可大可小,可以是字符,也可以是段落。可采用度量单位来指定文本块的大小。在度量单位前加入重复因子可以指定多个度量单位。本节定义了各种度量单位。

◎ 字符

字符可以是可见的,也可以是不可见的,可以是能打印出来的,也可以是不会打印出来的(包括SPACE和TAB字符)。下面是字符的一些示例:

a q A . 5 R - > TAB SPACE

◎ 字

类似于英语中的普通单词,字是由一个或者多个字符组成的字符串,它的两端可以为以下各元素的任意组合:标点符号、空格、TAB、数字和换行符。vim将每组相连的标点符号看作是一个字(如附表10-8所示)。





◎ 空白分隔字

空白分隔字与字相同,只是它包含相邻的标点。空白分隔字由以下的一个或多个元素分隔:空格、TAB和换行符(如附表10-9所示)。





◎ 行

行是由与换行符绑定的一串字符组成。物理行不一定与屏幕显示的逻辑行相同。当输入到屏幕的最右端还继续输入字符时,vim会自动换行到下一行,这样屏幕上显示的是两行,而实际的物理行仍然是一行。因为物理行是以Enter为结束标志的。建议用户输入到屏幕右端时,按下Enter键进行换行,这样可以使得屏幕显示的逻辑行与实际的物理行对应,这就可以避免一些不必要的麻烦。有些命令是按照较长物理行执行的,所以其执行结果可能与根据屏幕显示的行得出的结果不符。例如,当光标位于一个较长的逻辑行(包含多个物理行)时,按下Enter键,光标可能跨越了多个物理行。可以使用fmt将较长的逻辑行截断成多行。


◎ 句子

句子是英文句子或者相当于英文句子。一个句子从前一个句子的末尾处开始,到句点、叹号或者问号结束,后跟两个空格或者一个换行符(如附表10-10所示)。





◎ 段落

段落是指前后存在一个或多个空白行的块。一个空白行由两个连续的换行符组成(如附表10-11所示)。





◎ 窗口

在vim中,一个屏幕或者一个终端模拟窗口可以显示一个或多个逻辑窗口的信息。一个窗口将显示工作缓冲区中的部分或者全部内容。图10-5所示的屏幕就显示了两个窗口。


◎ 重复因子

在度量单位之前的数字称为重复因子。通常我们把“每5英寸”中的“5”看作是一个度量单位,和这个“5”的意义一样,重复因子是将vim的多个度量单位组合起来看作一个度量单位。例如,命令w是将光标向前移动一个字,则命令5w就是向前移动5个字,命令250w就是向前移动250个字。如果不指定重复因子,那么,vim就认为重复因子为l。如果重复因子要移动光标越过文件末尾,那么光标将定位到文件末尾。


▓ 本章小结
本节对vim编辑器进行总结,其中包括了本章介绍的所有命令,并且还附加介绍了一些命令。附表10-12列出了从命令行调用vim的一些方法。





根据度量单位移动光标的命令(如附表10-13所示)必须在命令模式下执行。Change命令、
Delete命令和Yank命令都可以使用度量单位,并且度量单位前可使用重复因子。








附表10-16列出了删除和修改文本的命令,其中字母M代表度量单位,在它的前面可使用重复因子,n代表重复因子选项,c为任何字符。








替换命令的格式为:

:[address] s/search-string/replacement-string [/g]

其中,address为一个行号或者是用逗号隔开的两个行号。旬点(.)代表当前行。可以使用标记或者搜索字符串表示行号。search-string是正则表达式,可以是简单的字符串。replacement-string为替代字符串。g表示进行全局替换(针对一行可能执行多次替换)。


附表10-18列出了vim其他的一些命令。





附表10-20 列出了vim的高级命令。





To be continued......
阅读(978) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~