vi编辑器的学习使用(十一)

虽然现在的专业的文字处理软件例如MS Word,Star Office,Open Office等可以很好的来完成的一些文档处理的工作,但是人们仍然是喜欢用纯文本的形式来处理手中的文本.这里因为用纯文本处理的文件比较容易阅读,不像那些专业的字处理软件,有专门的文件存储格式,少了许多的麻烦.Vim是一个强大的文本编辑器,他也可以像那些专来的字处理软件一样来处理我们手中的文本工作,从而使得我们的工作来得更漂亮.
Vim在默认的情况下是不会自动换行的,这也就是说我们在默认的情况下我们不得不自己决伫回车的位置.这样的设置对于处理程序文件来说是一件相当好的事情,因为这样可以由我们自己来决定回定回车换行的位置,从而可以很好的来完成我们的程序设计工作.但是如果我们是在处理一些文档工作,那么这个问题就有一些成为困挠我们的问题了.幸运的是Vim提供了这样的功能可以使我们来解决这样的问题.当我们指定了textwidth这个选项后,Vim就会自动的在相应的地方加上换行符.例如我们可以用下面的命令来指定一个只有30列的文本:
:set textwidth=30
这样以后当我们再输入文本时如果达到30这个限制,Vim就会自动的依据情况来加上换行符.在Vim中我们可以有两种方法来选择换行的方式.例如下面的命令是告诉Vim从左面算起30个字符时换行::set textwidth=30
而下面的命令则是告诉Vim从右面算起当达到margin个字符的空白时要换行:
:set wrapmargin=margin这里的margin是空白字符的个数.例如如果你有一个80个字符宽的文本,下面的两个命令则是起到了同样的作用:
:set wrapmargin=10
:set textwidth=70
Vim并不是那些专业的字处理软件,在我们指定了文本宽度的情况下,当我们将一行中的前几个文字删掉的话,Vim并不会像那些专业的字处理软件那样将后面行中的文本移到前面的行上,而是形成了一些长短不一的段落.这样看起来不是很好,因为我们需要的是有同一风格的文本形式.在Vim中这样的情况可以有几种处理方法:一是在可视化模式下选中这些文本,然后用gp命令来格式化选中的段落.另一种方法就可以使用gqmotion的命令来完成格式.例如我们要格式化5行,我们就可以用下面的命令:gq4j.这个命令是告诉Vim编辑要格式化本行,同时要格式化下面的4行.这样就达到了格式化5行的目的.在这样的情况下,向前移动的命令}这时就会为我们提供更大的便利了.这时我们的做法是这样的:将光标放在我们要格式化段落的第一行上,然后执行命令gq}.这样就可以达到我们的目的了.这样方法要简便得多,因为我们不必要再数细数我们要格式化多少行了.命令gqip可以格式化当前的段落.这个命令要比上一个的格式命令还要简便一些,因为在这样的情况下我们不必要将光标放在一个段落的第一行了.最后如果我们要想格式化一行的可以使用命令gqgq,当然了我们也可以简记为gqq.
我们都知道在专业的文字处理软件中有文本对齐的选项,而这在Vim当中也是可以做到的.如果要将文本居中对齐我们可以用这样的命令::range ceter width.在这个命令中如果我们没有指定textwidth的值,他将使用我们设置的textwidth的值,如果我们也没有设置这个值,那么他将使用系统定义的80.例如我们要将1到5行的内容居中对齐,我们可以使用下面的命令:
:1,5 center 30
同理右对齐的命令也可以类似的写成:
:1,5 right 30
但是左对齐的命令就与这两个命令有一些不同了,左对齐的命令为:
:range left margin
在这个命令中左对齐的参数并不是文本的宽度,而在文本左边的空白字符的宽度,如果为0,那么将紧靠屏幕的左边沿.在Vim中并没有内置的方法来对齐文本,但是我们可以使用一个简洁的宏包来完成这样的工作.要使用这个包先执行下面的命令:
:source $VIMRUNTIME/macros/justify.vim
在这个包中定义了一个新的可视化的命令_j.要对齐一个文本块,可以在可视化模式中高亮显示这个文本块,然后执行命令_j.
J命令可以使两行合并为一行,同时用空格为分格这两行.在文本处理中有一个joinspace的选项,如果设置了这个选项,那么可果一行是以标点符号来结尾的,那么在用这个命令后会用两个空格来区分这两行.也就是说如果我们用命令:set nojoinspace ,用J命令来合并这两行时会用一个空格来区分.但是如果我们用命令::set joinspace ,用J命令来合并这两行时会用两个空格来区.这就是这个选项所要起到的作用.
在Vim编辑器中我们可以通过设置formatoptions选项来设置Vim中的文本和注释的换行方式.这个命令为:
:set formatoptions=character
在这个命令中character一组格式化的标记,他可以是下面的一些字符:
t    文本自动换行
c    注释自动换行,同时自动在行首添加注释标记
r    当添加新行时自动添加注释符
o    当用O和o开始新的一行时自动在行首添加注释符
q    允许使用gq来格式化文本
2    第二行缩进两个字符
v    采用老的vi换行方式,当你输入空格时换行
b    在达到textwidth以前当输入空格时换行
l    在插入模式下不换行,只用gq来完成相应的工作
下面让我们来看一下这些选项是如何来工作的:
当需要文本自动换行时要打开t标记,当需要注释自动换行时要打c标记.所以对于一个要处理程序文件的人来说打开注释自动换行似乎要有更大的帮助:
:set formatoptions=c
这样在注释中的一个长句就会自动换行,而正常的程序文本就不会被自动换行.事实上我们常做些这样的选项:
:set formatoptions=cq
这个选项是告诉Vim编辑器不仅注释要自动换行,而且这些注释可以使用gq命令来格式化.
Vim编辑器可以很好的处理注释的问题.在C程序风格的程序文本处理过程中,当注释自动换行时Vim会自动在注释的开头加下注释标记.但是在这样的设置也还是存在一个问题的,那就是当你回车时Vim就不会在下一行的开头自动加上注释标记了.如果这一行仍写的是注释,那么就要你亲自来加上了.但是当我们打开r这个标记后就会解决这个问题了.这时如果你打回车,Vim编辑器还会在新的一行加上注释标记.这时如果你要想在下一行写程序文本,那么就不得不动手删除注释标记了.如果你希望当用O或是o添加新的一行时要自动添加注释标记就要打开o这个格式标记了.
格式标记选项是告诉Vim编辑器在格式文本中要从第二行开始而不是第一行.设置这个选项的命令为:
:set formatoptions+=2
而v标记则控制一个句子从哪里进行分裂.例如现在我们有一个句子:
This is a test of the very long warpp.
现在我们要在这个句子的后面新增一个词logic
如果没有v标记结果就会变成:
This is a test of the very
long line warpping logic.
而如果打开v标记,结果就会变成:
This is a test of the very long line wrapping
logic.
令管已经存在的文本已经远远的超过了textwidth的限制,但是因为设置了v标记,所以Vim编辑器也不会换行,相反只有你新增了一个词时才会换行.
在默认的情况下vim编辑器是使用内部的格式程序来模式文本,当然了我们也可以使用外部的格式程序来格式我们的文本.在UNIX和Linux系统中有一个标准的程序fmt可以很好的来做这样的工作.如果我们想用命令gq来执行这个处部命令,我们可这样的来进行设置:
:set formatprg=fmt
即使是没有进行这样的设置,我们也可以使用命令!来格式文本.例如如果我们想用程序fmt来格式一个段落,我们可以用这样的命令:!}fmt.!是开始了一个过滤命令,而}是告诉Vim过滤一个段落.fmt是我们要使用的命令的名字.
在早期的打印机的时代,开始新的一行要占用两个字符的时间.如果到了一行的结尾处,你要他快速的回到新的一行的开头,打印的针头在纸面上飞快到掠过,常常就会在纸面的中间留不希望的污点.这个问题的解决办法就是用两个字符来解决:一个字符<Return>来移到第一列,而字符<Line feed>来新增一行.计算机产生以后,存储较为昂贵,在如何解决回车换行这个老问题上,人们产生了不同的意见.UNIX人认为在到达一行的结尾时新增一行(<Line feed>),而苹果人则认同<Return>的解决办法,MS则坚持古老的<Return>,<Line feed>的方法.这就意味着如果你将一个文件从一个系统转移到另一个系统,你就面临着回车换行的问题.而Vim编辑器则会自动的认出这种文件格式方面的区别,并会为我们做出相应的处理.
fileformats选项包含了许多当编辑一个新文件时会用到的一些文件格式.例如下面的命令就是告诉vim编辑器将UNIX的文件格式做为第一选择,而将MS-DOS的文件格式做为第二选择:
:set fileformats=unix,dos
检测到的文件格式会被存放在fileformat选项中,我们可以且下面的命令来查找我们所使用的文件格式:
:set fileformat?
我们还可以应用fileformat这个选项将一个文件从一种文件模式转换成另一种文件格式.例如我们有一个名为readme.txt的MS-DOS文件格式的文件,而我们想将他转换为UNIX文件格式的文件.我们可以按照下面的方法来做:
首行编辑该文件:
$ vim readme.txt
其次将文件格式改为UNIX文件格式:
:set fileformat=unix
然后保存该文件,此时这个文件就转换成为了UNIX文件格式的文件.
在默认的情况下Vim编辑器认为我们的文件是由行组成的,也就是他认为文件中的最后一行是以<EOL>为结束符的.有时我们会遇到不包含有结束标记行的文件,当Vim遇到这样的文件时,他就会设置noendofline选项,而当遇到正常结束符的文件时则会设置endofline选项.如果你想设置你的文件以<EOL>结束符结尾则可以用下面的命令:
:set endofline
如果你想设置一个文件不以<EOL>结束符来结尾,则可以用下面的命令:
;set noendofline
在Vim中,我们有一系列的命令可使得我们在文件中进行移动,例如)命令向前移动一个句子,而(是向后移动一个句子,}向前移动一个段落,而{是向后移动一个段落.
曾经Troff是UNIX系统上专业的字处理程序,虽然在现代这个程序已经很少用了,可是Vim还是包含了一些选项使得我们可以用这种曾经的方式来处理文本.Troff需要用宏来告诉他应做一些什么.其中的一些宏开始一个新的段落.因为Troff要用许多的宏包来,因而Vim需要知道哪些宏将开始一个新的段落.paragraphs选项可以做这些工作.这个选项的格式如下:
:set paragraphs="macromacro..."
每一个宏是两个字符的Troff宏名,例如:set paragraphs="P LP"是告诉Vim宏.P和.LP开始一个新行.在默认的情况下paragraph的选项如下:
:set paragraphs=IPLPPPQPP LIpplpipbp
这个命令列出下面的一些开始一个新段落的宏名:
.IP .LP .PP .QP .P .LI .pp .lp .ip .bp
我们可以使用命令[[和[]向前移动一个区间,而使用命令]]和][向后移动一个区间,一个区间是用页分隔符(CTRL-L)定义的文本.我们也可以用Troff的宏来定义一个区间,section选项有些类似于paragraph选项,所不同的是前者定义一个宏用来分隔区间,而后者是段落.默认情况下是这样的;
:set section=SHNHH HUnhsh
在用Vim进行文本处理时我们还可以对文本进行加密处理,这种加密处理是最弱的一种加密处理方法,常常用新闻的发布.这时我们要用到的命令为g?motion.例如我们可以用命令g?g?或者是g??来加密当前行.当我们对一文本进行两次加密处理就为解密处理了.

posted @ 2005-07-25 19:53  jlins  阅读(310)  评论(0编辑  收藏  举报