`
suoyihen
  • 浏览: 1358821 次
文章分类
社区版块
存档分类
最新评论

大家来学VIM(一个历久弥新的编辑器)

 
阅读更多

大家来学VIM(一个历久弥新的编辑器)

作者:[1]EdwardLee
最后修订日期:2000.05.05

目 录

[2]一、前言
[3]为什么选VIM?
[4]何处抓VIM(elvis)?
[5]编译安装
[6]勤前教育
[7]基本教练:stepbystep

[8]二、游标的移动
[9]基本的游标移动
[10]进阶的游标移动
[11]特殊的移动

[12]三、基本编辑指令
[13]进入i-mode的指令
[14]删除指令
[15]取代及还原
[16]加上数目字
[17]简单重排功能

[18]四、复制(yank)
[19]指令说明
[20]天大的指令
[21]疑难杂症

[22]五、寻找、替换
[23]寻找
[24]更方便的寻找操作(vim才有)
[25]替换(substitute)
[26]书签功能
[27]vim对於书签的扩充功能

[28]六、叫档、存档、紧急回复
[29]开档的一些花招
[30]多档编辑
[31]离开
[32]vim的加密功能
[33]紧急回复

[34]七、各种标示方法与视窗操作
[35]标示指令
[36]视窗操作

[37]八、shell命令及求助系统
[38]shell命令
[39]求助系统

[40]九、set功能设定
[41]该在何处设定?
[42]如何得知目前的设定
[43]各种set功能设定说明
[44]关於softtabstop(sts)
[45]关於折行

[46]十、规则表示式的运用
[47]基本的匹配
[48]中介字元
[49]全域性的指令
[50]&替代变数
[51]greedy陷阱



[1]次单元[2]目 录

大家来学VIM(一个历久弥新的编辑器)[一]


前言

鉴於仍有许多人还没找到顺手的编辑器,而许多想学vi的人又觉得无从下手,
因此在此提出一些个人的心得,希望能对这些朋友有点帮助。或许也减少一点
FAQ吧!

真要深入的话,大多数的前辈都认为vi比emacs(xemcas)还难学。但谁又真
的需要熟悉编辑器的所有功能呢?你大可以边用边学啊!需要用到的先学,其它
的就放一边,只要能善用一些常用到的功能,又何必要那么深入呢?而且您在使
用当中经常会发现一些新功能,这又会马上让您给赚到了。


为什么选VIM?

最最重要的原因是可以正确处理中文!其它如elvis,vile,nvi在中文方面都会
有问题。另外就是许多作业系统都有VIM可用。当然如果您不需要中文支援的
话,也建议使用elvis。vile则有emacs的味道,而nvi大概是最忠於原味
的了!至於原始vi的书已有中文翻译(O'Reilly),各位到大一点的书局翻翻
就有了。所以选定VIM做对象,兼述及elvis,至少她不「排斥」中文。

*VIM代表ViIMproved。
*elvis可直接读HTML(可用来上网,但只有文字),binary,manpage及
TeX(LaTeX)(不是只显示程式码喔!)档,和XA+CV配合也可以用中文,但
不能真正处理就是了!
*VIM也不是真的能完全支援中文啦!有些细部的功能还是没法度。大概6.0
版的时候会更好!不过平常一般的编辑动作是没问题。

另一个原因是,VIM是慈善软体(CharityWare),如有赞助或评比得奖(前不
久刚得过),所得皆救助乌干达孤儿,有点年纪的大概还记得"WeAreThe
World"这首歌吧!全球的艺人共同合唱的,就是救助这些孤儿(应该没记错吧
!)。您要使用当然是免费,您要捐款赞助当然是不勉强啦!但如果有评比有奖
金可拿的,您去投她一票就是功德无量了。

另外vim的规则表示式(regularexpress)颇完整,您也可借这个机会学
regexp,因为您在sed,awk,perl,less,grep...中也是要用到,早点会regexp
您生活在Linux(Unix)的世界会更美好。学了regexp您会有点看不起windows
系统中的寻找功能的。

由於是慈善软体,广结善缘,因此连中文繁体都支援,不简单。但也因此最近的
版本有点肥,但又不会太肥(比xemacs好多了啦!)。这么可爱的软体,能不用
她吗?


何处抓VIM(elvis)?

[3]http://www.vim.org/
找个自己中意的mirro站抓。或许也顺便抓Win32的可执行
档回来在windows系统中使用。别忘了runtime档也要抓,
否则会无法找到需要的档案来执行。

[4]http://www.fh-wedel.de/elvis/index.html
[5]ftp://ftp.pdx.edu/pub/elvis
也可试试elvis(当然是免费的)。

CLE的使用者也可以到:
[6]ftp://linux.tmtc.edu.tw/pub/CLE/i386/RedHat/RPMS
抓最新版来安装,省时省力,而且还把必要的中文设定都弄好。
目前最新的版本,VIM是5.6,elvis是2.1-4。


编译安装

只讲重点,避免罗嗦!

VIM:

1.configure时加上:
--enable-multibyte
--enable-xim如果您使用xcin2.3的话,就不必了
--enable-fontset
--enable-gui=gtk
gtk+最好是1.2.3以上的版本,1.2.1也是将就可以啦
!大家都用gtk+了,您不会想编Athena或
Motif(lesstif)吧!而且后两个版本的GUI就没有漂亮的
icon了(但有的人就是讨厌这些无用的icon)。

2.~/.vimrc加入:
setfileencoding=taiwan
setguifontset=英文字型,中文字型
设了guifontset就不能设guifont否则会优先使用
guifont,这样就找不到中文字型了!console下或xterm
下的话,就看您用什么字型就显示什么字型,和
guifontset无关。
*英文字型要用固定字,建议使用危卵的AndaleMono这个字型,包您满意
,可去危卵抓,免费的。我个人是使用180的Andale字,配上220的中
文字,绝配(1024x768)!哦!不要告诉我,您的Xserver还不能支援TTF

*Windows中文版无需设guifontset,只要设guifont即可。

3.使用xcin2.3的话还是得配合XA+CV主要是输入的问题。
使用xcin2.5的话就不必XA+CV了,但您得另外设xim,
请进入VIM后:helpxim。

4.locale要设成zh_TW.Big5,意思就是您的系统的i18n
支援不能太差,我是使用gvim-chineseshellscript
来呼叫gvim。

#!/bin/sh
#gvim-chinese
#unsetLD_PRELOAD如果您使用xcin2.5x的话
exportLC_ALL=zh_TW.Big5
gvim"$@"

elvis:

elvis没什么好说的,反正是靠XA+CV来显示及输入中文
。至於其他外观调整,就请manelvis。


勤前教育

VIM的模式可有六种,为免初学的人搞混,仍依一般的分类分成三种:

1.Normalmode(commonmode,以下简称c-mode):
您一进入VIM就是处於c-mode,只能下按键指令,不能输入文字。这
些指令可能是游标移动的指令,也可能是编辑指令或寻找替换指令。

2.Insertmode(i-mode):
按i就会进入i-mode,此时才可以键入文字,写您的文章,按Esc又
会回到c-mode。

3.Edmode(common-linemode,e-mode):
按冒号:(别忘了Shift键)就会进入e-mode,左下角会有一个冒号:
出现可下ed指令。也是按Esc回c-mode。反正正常状态都是处於
c-mode,这样才不会把您辛苦打字的文章给随便搞乱掉。

+ed是一个很古老的行编辑器,就好像DOS下的edline一样
,vi,sed这些编辑器都是从ed衍化而来的。当然DOS下的edline
也是学ed而来的,但功能可就不能同日而语了!有兴趣可maned
学看看,有些时候会只有ed可以用(当机救助的时候)。

其它的模式就碰到时再说明了!


基本教练:stepbystep

1.由命令列来开档:
vimtest.txt或gvimtest,txt或gvim-chinesetest.txt如果您的
系统vi是vim的连结档话,就可以直接用vitest.txt。以下就直接
用vim代表vi,gvim,elvis因操作是一样的有不同的地方会加注说
明。

2.先进入vim后再开档:
进入vim后,使用冒号命令:etest.txt,就可以编辑test.txt这个
档。1.及2.这两个开档法,如果test.txt不存在的话,就会开一个
以test.txt为名的新档案。

+如果是gvim,可由icon(gtk版本才有)或功能表来叫出file
browser来选看看您要编辑哪一个档,但如果您是初学的话不建议您
这么做,vi就是以按键快速闻名,这是她的优点,您还是学起来吧,
不然没有GUI的时候会很不习惯的。

3.编写文件:
进入vim后,按i进入i-mode,就可以编写您的文件了。在vim游
标的移动可以由方向键来移动。Backspace键可消去前一个字元,中文
的话是一个中文字。Del键可删除游标所在处的字元(中文字)。

+原始vi是不能在i-mode随意移动游标的,得进入c-mode才能移
动,因此就常常要按Esc来变换模式。vim及elvis都打破了这个
规矩。

4.存档、离开:
如果您写好您的文件,就可以按Esc回到c-mode,然后:w就会存档
(注意,是冒号命令),但还不会离开vim,要离开可按:q,就可以了
!也可以合起来用,:wq,就样就会存档后离开。怎么样,也不会很难吧
!只不过操作方式和别的编辑器不一样罢了,这样岂不是很有个性。:-)

+尽量记住按键的意义,才不必死背,如e是edit(编辑),w是
write(写入),q是quit(停止、离开)。


好了,这是就编辑的整个过程。下回开始是详述各部份的功能,把vim解剖开
来讲,您可以马上现学现卖。由於vi(m)的操作方式很有个性,因此,用了一
次就会记住有这么一个功能,想忘也忘不了,但有时按键难免会忘记,但有这一
种功能大概是忘不了的,查了几次指令就可以记得住了。

[7]次单元[8]目 录

_________________________________________________________________

最后修订日期:2000.05.05
[9]EdwardLee




[1]前单元[2]次单元[3]目 录

大家来学VIM(一个历久弥新的编辑器)[三]

基本编辑指令


这个单元就开始进入主题了。下编辑指令都是在commond-mode(c-mode),就是
您一进入vim时的模式,只能下指令,不能键入文字。如果印象模糊,请瞄一
下第一个单元的内容。这个单元说的是基本的指令,有些比较特殊的编辑指令,
因为太有个性了,所以会独立成一个单元来说明。


进入i-mode的指令

i在游标所在字元前开始输入文字(insert)。
a在游标所在字元后开始输入文字(append)。
o在游标所在行下开一新行来输入文字(open)。
I在行首开始输入文字。
*此之行首指第一个非空白字元处,要从真正的第一个字元处开始输人文字,
可使用0i或gI(vim)。

A在行尾开始输入文字。
*这个好用,您不必管游标在此行的什么地方,只要按A就会在行尾等著您
输入文字。

O在游标所在行上开一新行来输入文字。
J将下一行整行接至本行(Joint)。
*并无相对的split功能,可在i-mode下按Enter来达成,当然如果您熟
macro的话,可自行定义。
*使用J时,预设会消去本行的EOL,且上下行接缝间会留下一个空白字元
,这符合英文习惯,却对中文会造成困扰,欲不留空白字元,可使用gJ(
大写J)指令,但这是vim的扩充功能,elvis不适用。
*请您随便找一个档案来试看看,光看文字说明太抽象了。


删除指令

x删除游标所在处之字元。在vim及elvis亦可用Del键。
X删除游标前之字元。不可使用Backspace键。
*vim可以正确使用以上两个指令於中文,会删去一个中文字。elvis则不行
,一个中文字要删两次,即使用xx。

dd删除一整行(deleteline)。
dw删除一个字(deleteword)。不能适用於中文。
dG删至档尾。
d1G删至档首。或dgg(只能用於vim)。
D删至行尾,或d$(含游标所在处字元)。
d0删至行首,或d^(不含游标所在处字元)。
*请回忆一下$及^所代表的意义,您就可以理解d$及d^的动作,这就
是vi(m)可爱之处。


取代及还原

r取代游标所在处之字元。vi(m)很有个性的,您在c-mode按
了r她就会停在那里等主人键入所要替代的字元,希望您这
个当主人的,不要傻呼呼的也楞在那里,赶快键入您的新字元
吧!:-)
*vim中可用於中文字,也就是可以替换一个中文字,elvis则不行。当然您
的vim是要设在taiwan的才行。怎么样!有没有看过如此有个性的取代
方式?ㄚ!r就是replace啦!

R取代字元至按Esc为止。
cc取代整行内容。或大写S亦可。
cw替换一个英文字(word),中文不适用。(change)
~游标所在处之大小写互换。当然不能用於中文。别忘了Shift!
C取代至行尾,即游标所在处以后的字都会被替换。或c$。
c0取代至行首,或c^。
s替换一个字元为您所输入的字串。和R不同,R是覆盖式的取
代,s则是插入式的取代,您可亲自实验看看。ㄟ!是小写的
s。
u这个太重要了,就是undo,传统的vi仅支援一次undo,vim
及elvis就不只了,vim是没有限制的。
U在游标没离开本行之前,回复所有编辑动作。
Crtl+r这个也是很重要,就是redo键。


加上数目字

喔!骚到vi(m)的痒处了,这是vi(m)一个非常骚包的功能,只此一家别无分
号(当然同源的ed,sed等不在此限)。就是您可以在大部份的指令前加上数
目字,代表要处理几次的意思。以下用实例来说明比较清楚。
5dd删除游标所在处(含)起算以下五行内容。妙吧!
3r按了3r后,您键入一个英文字,则三个字元皆会被您所键
入的英文取代。很抱歉,这不能用於中文。
5J将五行合并成一行。
3x删除三个字元。抱歉,不能用於中文。
5iA然后按Ecs,插入五个A。中文也可以!
2isystemEsc插入systemsystem。中文也可以!
5G游标移至第五行,是从档首开始起算。
5l移至右第五个字元处,当然j是可以用方向键取代的。
所有移动指令(参考第二单元)都可以加上数目字来控制,中
文也通喔!elvis当然是不能用於中文。

其它的指令和数目字结合,就留待各位去发掘吧!最重要的是请您亲自操作看看
,使用vi(m)常常要动动脑筋,会有更妙的操作方式。


简单重排功能

>>整行向右移一个shiftwidth(预设是8个字元,可重设)。
<<整行向左移一个shiftwidth(预设是8个字元,可重设)。
*:setshiftwidth?可得知目前的设定值。:setshiftwidth=4可马上重设
为4个字元。shiftwidth可简写成sw。ㄟ,别忘了Shift键!

:ce(nter)本行文字置中。注意是冒号命令!
:ri(ght)本行文字靠右。
:le(ft)本行文字靠左。
*所谓置中、靠左右,是参考textwidth(tw)的设定。如果tw没有设定,
预设是80,就是以80个字元为总宽度为标准来置放。当然您也可以如sw
一样马上重设。

gqip整段重排。中文会出槌!:-(
gqq本行重排。
*重排的依据也是textwidth。这里的重排是指您键入文字时没有按Enter
键,就一直在keyin,这样会形成一个很长的一行(虽然萤幕上会替您做假
性折行),重排后,则会在每一行最后加入EOL。gq重排功能是vim才有
的功能。

[4]前单元[5]次单元[6]目 录

_________________________________________________________________

最后修订日期:2000.05.05
[7]EdwardLee



[1]前单元[2]次单元[3]目 录

大家来学VIM(一个历久弥新的编辑器)[四]

复制(yank)


yank是什么意思?有疑问的请查一下字典吧!就好像是中医治疗中的「拔罐」
的意思啦(是不是叫「拔罐」?知道的朋友指正一下吧)!反正在vi(m)中,
她就是复制copy的意思。这在vi(m)的思考逻辑里,就是「拔」yank起来,
「放」put上去。其实复制的指令就是y一个而已,为什么要独立成一个单元
来说明呢?因为vi(m)复制、贴上的功能实在太独特了,再配合第三单元介绍
的数目字,及vi(m)内部的缓冲区来使用的话,您会发现,原来vi(m)肚子里
还暗藏著秘密武器。


指令说明

yy复制游标所在行整行。或大写一个Y。
2yy或y2y复制两行。ㄟ,请举一反三好不好!:-)
y^复制至行首,或y0。不含游标所在处字元。
y$复制至行尾。含游标所在处字元。
yw复制一个word。
y2w复制两个字。
yG复制至档尾。
y1G复制至档首。
p小写p代表贴至游标后(下)。
P大写P代表贴至游标前(上)。
*整行的复制,按p或P时是插入式的贴在下(上)一行。非整行的复制则
是贴在游标所在处之后(前)。

"ayy将本行文字复制到a缓冲区
*a可为26个英文字母中的一个,如果是小写的话,原先的内容会被清掉,
如果是大写的话是append的作用,会把内容附加到原先内容之后。
*"是Enter键隔壁的那一个同上符号(dittomarks)。

"ap将a缓冲区的内容贴上。
*缓冲区的术语在vim称为registers,vim扩充了相当多的功能,有兴趣
深入的朋友请:hregisters。您用d、c、s、x、y等指令改变或删除的内
容都是放在registers中的。例如:您用dd删除的一行,也是可以使用
p来贴上的。只要是在缓冲区的内容都可以使用p来贴上,不是一定要y
起来的内容才能用p。因此您认为p是paste也可以,认为是put可能
较正确。

5"ayy复制五行内容至a缓冲区。
5"Ayy再复制五行附在a内容之后,现在a中有十行内容了!
*ㄟ!不要我一直用a您就认为只有a可以用喔。26个英文字母都可以的
,交叉运用下,您会发觉vi(m)肚量不小。
*问题来了!忘记谁是谁的时候怎么办?:reg(冒号命令)就会列出所有
registers的代号及内容。您现在就试著按看看。咦!怎么还有数目字、特
殊符号的缓冲区,原来您刚刚删除(复制)的内容就预设放在"这个缓冲
区,然后依序是0,1,2,...9。也就是说您按p不加什么的话,是取出"
缓冲区的内容的。%指的是目前编辑的档案,#指的是前一次编辑的档案。
还有其它的呀!因为没什么重要,就请:hregisters吧!registers有个
"s"结尾,不要搞错了,而且Tab的补全键vim也支援的,也就是说您键
入:hregi再按Tab键,vim就会帮您补全,按了Tab后发现不是您要
的,那就继续按,总会出现您要的。:-)
*Tab补全的功能,elvis也有,但叫出registers列表的命令则没有,您
得自行记忆在您的脑袋瓜子里。而且elvis的补全能力并没vim强。


天大的指令

.这是什么?ㄚ,是英文句点啦!没错,就是英文句点。什么意
思?重复前次的编辑动作。这个指令太高明了,只要是编辑动
作(移动游标不算,冒号命令也不算)都可以按英文句点来重
复,要重复几次都可以。

例如:您按了yy,然后按p就会复制、贴上一整行,如果要重复这个
动作的话,就可以按.,也可以把游标移到其它地方后再按。其它dd
,dw,r,cw等编辑指令都可以这样来重复。如果您要重复做某些编辑
动作时,千万千万一定要想到有这么一个英文句点重复指令。ㄚ,拜托
啦!您一定要常用这个指令。


疑难杂症

1.那mouse中键的剪贴功能还有吗?
当然还有,不管在console或Xterminal中都照用不误。当然在
windows下的话就不能用了,可以用Shift-Insert来代替。Ctrl-v在
vim中另有作用,在windows下就不必去麻烦它了。

2.ㄟ,我从netscape用mousecopy东东过来的时候,常常都搞得天下大乱
耶!
要设成:setpaste,预设是map至F9键的,您要copy之前先按一
下F9,copy完后再按一次F9来回复。这是vim的扩充功能,elvis
没有。那在elvis怎么办?只好:setnoai了。在GUI的版本应不会
有这种情形。

+set的功能先不必去理它,往后会有一个单元专门讨论。


朋友!您睡著了吗?不要被吓到了,您只要开个档案,亲自操作一下就能心领神
会。那用mouse不是更方便吗?不见得,yyp来复制贴上一整行比较快,还是
用mouse来拉比较快?您可以试看看。

[4]前单元[5]次单元[6]目 录

_________________________________________________________________

最后修订日期:2000.04.06
[7]EdwardLee


[1]前单元[2]次单元[3]目 录

大家来学VIM(一个历久弥新的编辑器)[五]

寻找、替换


搜寻、替换的功能几乎是每个编辑器必备的功能,那在vi(m)中有没有特殊的
地方呢?当然有,您忘了,vi(m)是个性十足的编辑器。最特殊的地方是和规则
表示式(regularexpression,简称regexp)结合在一起。简单的说她是一种
pattern的表示法,在执行动作,如寻找或替换,就会依据这个pattern去找
,所有符合pattern的地方就会执行您所下的动作。在这个单元里暂不讨论
regexp,会另立一个单元来探讨,以免搞得头昏脑胀。目前就暂不使用regexp
,您要找什么就直接键入什么就对了。


寻找

/在c-mode的情形下,按/就会在左下角出现一个/,然后键
入您要寻找的字串,按个Enter就会开始找。
?和/相同,只是/是向前(下)找,?则是向后(上)找。
n继续寻找。
N继续寻找(反向)。


更方便的寻找操作(vim才有)

*寻找游标所在处之word(要完全符合)。
#同上,但*是向前(下)找,#则是向后(上)找。
g*同*,但部份符合即可。
g#同#,但部份符合即可。
*n,N之继续寻找键仍适用。


替换(substitute)

:[range]s/pattern/string/[c,e,g,i]

range指的是范围,1,7指从第一行至第七行,1,$指从第一行
至最后一行,也就是整篇文章,也可以%代表。
*还记得吗?%是目前编辑的文章,#是前一次编辑的文章。

pattern就是要被替换掉的字串,可以用regexp来表示。
string将pattern由string所取代。
cconfirm,每次替换前会询问。
e不显示error。
gglobe,不询问,整行替换。
iignore不分大小写。
*g大概都是要加的,否则只会替换每一行的第一个符合字串。可以合起来用
,如cgi,表示不分大小写,整行替换,替换前要询问是否替换。

[实例] :%s/Edwin/Edward/g
    这样整篇文章的Edwin就会替换成Edward。

更进阶的寻找、替换的例子在说明regexp的时候还会再详述。目前只知道最基
本的用法就可以了!其实光这样就非常好用了。:-)


书签功能

这又是vi(m)的一个秘密武器,简单的说,您可以在文章中的某处做个记号
(marks),然后跑到其它地方去编辑,在呼叫这个mark时又会回到原处。妙
吧!
mxx代表26个小写英文字母,这样游标所在处就会被mark。
`x回到书签原设定位置。
*`是backwardquote,就是Tab键上面那一个。

'x回到书签设定行行首。
*'是forwardquote,是Enter键隔壁那一个。


vim对於书签的扩充功能

小写字母只作用於单一档案内。
大写字母可作用於编辑中之各档案间。
数目字可作用於前次编辑的十个档案。
*数目字的用法比较特殊,'0是回到前一次编辑档案中离开前的最后位置
,'1则是回到前二次编辑档案的最后位置,依此类推。您不必使用m来标
示,vim会自动记忆。很玄吧!其实这是viminfo的功能,您要认真追究
的话,请:hviminfo-file-marks。viminfo关掉,就没这个功能了!
*所谓前次指的是前次启动的vim。

:marks得知目前所有书签的列表。

[4]前单元[5]次单元[6]目 录

_________________________________________________________________

最后修订日期:2000.05.05
[7]EdwardLee


[1]前单元[2]次单元[3]目 录

大家来学VIM(一个历久弥新的编辑器)[六]

叫档、存档、紧急回复


ㄟ,是不是在灌水呀!怎么开个档也成一个单元?那您就错了,在vi(m)里叫
档的花样可多了,而且又可以多档编辑,各编辑中的档案还可以互通讯息,这里
面学问可大著呢!vim就更骚包了,也学人家档案可以加密,虽说是噱头,但也
还满好用的。


开档的一些花招

vim+档名这样开档后,游标会落在档案最后一行的行尾,在档
案屁屁后干什么呢?方便您可以继续编辑嘛!:-)
vim+n档名游标会落在第n行的行首。
vim+/string档名
*还记得吗?/就是寻找指令,这样进入档案后游标就会落在第一个找到的
string上,还可以按n继续找string喔!哦,string还可以使用
regexp来表示喔。


多档编辑

多档编辑会有两种情形,一种是在进入vim前所用的参数就是多个档(这种情
形称为argumentlist)。另一种情形是进入vim后另外再开其它的档(称为
bufferlist)。不过都可以统称为buffer。
:n编辑下一个档案。
:2n编辑下二个档案。
:N编辑前一个档案。
*注意,这种用法只能用於argumentlist的情形。

:e档名这是在进入vim后,在不离开vim的情形下再开其它档
案。只要您要编辑的档案是在目前目录,Tab补全键还是
可以使用。
:e#或Ctrl-^编辑前一个档案,用於两档互相编辑时相当好用。
*这种用法不管是argumentlist或bufferlist档案间皆可使用。
*还记得吗?#代表的是前一次编辑的档案。

:files或:buffers或:ls会列出目前buffer中的所有档案。
*在elvis中可使用:b来叫出buffers。
*在buffers中,减号-表示这个buffer并未载入,不过,不必担心,载
入相当快速的。加号+表示这个buffer已经修改过了。

:bnbuffernext。
:blbufferlast。
*以上两个指令elvis不适用。

:b档名或编号移至该档。
*在:ls中就会出示各档案的编号,这个编号在未离开vim前是不会变的。
这个指令elvis也是可以使用。
*当然:e#编号也是可以的,这样的用法则是所有viclone都通用了。
*如果您是使用vim的GUI,那就在功能表上就会有Buffers这个选项,可
以很容易的知道及移动各buffer间。

:bd(elete)buffer在未离开vim前是不会移除的,可使用这个指
令移除。其实移除她干什么呢?vim是您在叫用时才会载入的,
因此这些buffers并不是像cache一般要占记忆体的。
:e!档名这样也是会开档,但会放弃目前编辑档案的改变,否则
如果档案已有变动,vim预设是不让您随便离开的。:e!后不接
什么的话,代表舍弃一切修改,重新载入编辑中档案。
:f或Ctrl-g
显示目前编辑的档名、是否经过修改及目前游标所在之位置。
:f档名改变编辑中的档名。(file)
:r档名在游标所在处插入一个档案内容。(read)
:35r档名将档案插入至35行之后。
gf这是vim的特殊叫档法,会叫出游标所在处的word为名的档
案,当然,这个档案要在目前目录内,否则会开新档案。

哦!好像有点给他复杂,主要原因是偶文笔不好啦!不过您何不选个顺手的来用
就可以了,选定了,以后就是使用他,这样就不会那么复杂了。:-)


离开

:q如本文有修改而没存档,会警告,且无法离开。(quit)
:q!舍弃所有修改,强迫离开。
:wq存档后离开。纵使档案未曾修改也是会再存一次档。
:x也是存档后离开,但如果档案没有修改,则不会做存档的动作。
ZZ和:x完全一样,随您高兴用哪一个。
:w档名另存他档。不加档名就是写入原档。(write)
*:q及:q!是对目前编辑中的档案作用,如果多档编辑的情形并不会离开
vim,这时可下:qa或:qa!来整个离开vim。a就是all的意思。
*:指令!,这个!的意思是强迫中止目前正在编辑的动作,而去执行所下的
指令。各位应该到目前为止碰过好几次了吧!


vim的加密功能

vim-x[档名]
这样进入vim后会要求输入密码。以后加密过的档案由vim开启时会
自动要求输入密码。否则无法开启。其它的编辑器当然是无法开启的。

进入vim编辑档案中,临时想加密,可用:X指令。

+小心!vim一开档就会有个.档名.swp这个档,是为了紧急回复用的
,一般是在您所开档案的所在目录,这是个隐藏档,ls要有-a参数
才看得到,您加密的功能并没有作用在这个swp档,因此root还是
知道您在写些什么关於他的坏话的。:-)当然啦!山不转,路转,路不
转,人转,您也是可以把swap的功能关掉的:setnoswf就行了!
但如果您编辑的是大档案,则不建议您把swap关掉,这样会很吃记
忆体的。
+elvis的话,其暂存档是统一集中存放在/var/tmp/*.ses,权限是档
案所有者始能读写。vim的早期版本,其*.swp档是依原档案的权限
来设定的,最近的版本则从善如流,已经改成档案所有人始能读写,
就是-rw-------啦!


紧急回复

vim-r档名,或进入vim后,下:recover档名,来回复。

[4]前单元[5]次单元[6]目 录

_________________________________________________________________

最后修订日期:2000.05.05
[7]EdwardLee


[1]前单元[2]次单元[3]目 录

大家来学VIM(一个历久弥新的编辑器)[七]

各种标示方法及视窗操作


这个单元多了一种模式,那便是visualmode(以下简称v-mode)v-mode下的
反白区(反黑区?^_^)在本文就统一称为标示区,不知各位是否有更好的中文
名称?ㄟㄟㄟ,视窗操作和标示有什么关系?为什么摆在这里说明?ㄚ,是因为
这两个单元内容都不多,没地方摆,所以就将就凑在一起的啦!乱点鸳鸯谱就请
各位见谅。


标示指令

v小写v,这是属於字元标示(charactervisual),按下v后
您就可以移动游标,游标走过的地方就会标示起来。再按一次
v就会结束v-mode。您用mouse拉出的标示区也是属於这类
的标示。
V大写V,这是行标示(linevisual),按下V后会整行标示起
来(包括行首前空白的部分),您移动上下键,会标示多行。
mouse连按三次左钮,也是属於此类的标示。再按一次V就会结
束v-mode。
*mouse按两次左钮是标示一个word。按三次是整行标示。

Ctrl-v这是方块标示(blockvisual),可纵向标示矩形区域。
再按一次Ctrl-v就会结束v-mode。
*结束v-mode的方式亦可使用Esc键,或统一使用Ctrl-c。
*windows系统下Ctrl-v是复制键,可以使用Ctrl-Q来替代。

d删除标示区内容。
y复制标示区内容。
*ㄟ…是要先标示好才按的。"ay还能不能用呢?当然可以,这样就会把标示
区内容存於a缓冲区中。可以用"ap来贴上。

Shift->标示区内容向右移一个Tab。
Shift-<标示区内容向左移一个Tab。

您想更深入吗?:hvisual.txt就有详细的介绍,ㄟ,别忘了有Tab补全键可
以用。


视窗操作

Ctrl-wn即:new。开一空的新视窗。
*这在vim会开在原视窗上半方,也就是视窗一分为二。在elvisGUI界面
的话,则是实实在在的另开一个新视窗(可不是另启动一个elvis喔!)
,当然elvis的console上也是和vim一样,视窗一分为二。而且在
elvis下,要放开Ctrl-w后才按n,否则elvis会不鸟您的。
*凡视窗操作的按键都是由Ctrl-w来起头的,w就是window。

Ctrl-ws即:sp(lit),会开一新视窗,且原档分属两个视窗。
Ctrl-wf开一新视窗,并编辑游标所在处之word为档名的档案。
Ctrl-wq即:q结束分割出来的视窗。
Ctrl-wo即:only!使游标所在之视窗,成为目前唯一显示的视窗
其它视窗会隐藏起来。
Ctrl-wj移至下视窗。
Ctrl-wk移至上视窗。
*还记得hjkl的按键移动方式吗?

:sp档名开另一新视窗来编辑档案。

如果您觉得这样分割个视窗来编辑档案不怎么方便,那您可以利用X下的虚拟
桌面,多开个xterm+vim来做多档编辑也是可以的啦!不过这样不仅会多占
记忆体,而且vim中好用的书签功能就没法使用了。

[4]前单元[5]次单元[6]目 录

_________________________________________________________________

最后修订日期:2000.05.05
[7]EdwardLee


[1]前单元[2]次单元[3]目 录

大家来学VIM(一个历久弥新的编辑器)[八]

shell命令及求助系统


shell命令

:!外部指令执行外部指令。当然您的指令要在PATH内。
:!!执行前一次执行之外部指令。
*在这里的!可不是强迫中止喔!
*vim中有一个很特殊的指令@:,是重复前一次的冒号命令。

:sh(ell)执行shell。使用exit回来。
*这在vimGUI会在原视窗内显示执行结果,在elvisGUI则会另开一
xterm视窗。console或xterm下的vim当然就是跳出vim进入shell
中。
*至於是用哪一种shell是可以另外设定的,可由setshell=来设定。在
windows的版本中设定时如遇有空白字元档名时要由/来escape,例如:
:setshell=/"c:/program/files/unix/sh.exe/"/-f
建议抓个bash来用啦,配合一些Win32中的UNIX指令会更适配。
*在此补充一下补全的功能。不是只有Tab键的补全功能喔!也可以使用上
下方向键,叫出历史指令,叫出历史指令可用於冒号命令及寻找命令(/)
。例如,您前已下了:!psaux这个指令,您可以按:后就直接按向上方
向键。别忘了!寻找指令也是可以这样用喔!

:r!commond
这个就妙了!会在游标所在处次一行插入外部指令commond执行
后的输出内容。例如:r!date就会插入日期时间。这在elvis
是会插入在游标所在处那一行。
:n,mw!commond
以n至m行内之资料,当做外部指令commond的input。这算
是相当高级的用法了,初学者大概还用不上,不过印象中留有一
个这样的功能,以后总是会用得上的。
K大写K会显示游标所在处之word的manpage。elvis不适用。
windows版本亦不适用。


求助系统

原始vi是没有on-linehelp的,但vim及elvis则有相当丰富的说明系统
。vim沿用传统tag的方式来找主题,而elvis就高明了,是使用HTML的格
式。原来elvis是可以直接阅读HTML档的,当然不能显示图档,但会标明图
档的名称。
F1用过pe2(3)吗?好像F1是救助键已让大家公认。vim预设
按F1就会叫出说明档。elvis当然没有,不过您可以自行设
定,在~/.elvislib/elvis.rc中加上
map#1:help^M
就可以了。须注意的是^M是按Ctrl-v后不放再按M或
Enter键,表示马上执行。ㄟ,^M是特殊字元,是一个字元
,而不是两个字元,您移动游标在^M上就知道了,不是我文
中的,文中的是直接打出来的两字元^M。
*在console下要打特殊字元的话,要Ctrl-Shift-V然后按您要的键。

:hname这样就会叫出name这个说明档,如果后面没接name,则会叫出
help.txt这个总说明档(在evlis是elvis,html)h是help的缩写。ㄟ
,name记不清楚时,别忘了Tab补全。在vim的说明档中,遇有两个|围
住的主题,把游标移到上面就可以使用Ctrl-]来叫出这个主题的说明
,Ctrl-T可以回到原说明,elvis中也是可以这样用。mouse按两下也是可以
叫出说明。:q可结束说明档,回到原编辑档案。:ver会显示版本、编译资讯
,编译时加入之参数也会显示出来,让您知道有加入些什么功能,因为有些功
能在编译时就得加入。其中正号+表示有此功能,减号-表示无此功能
。elvis只能显示版本资讯,无法显示编译资讯。
*在下都会编译出一个全功能的vim来备用,而且GUI及console下使用
的各编一个,以加快console下的启动速度。

在此补充说明一点,各位有没有觉得:q很常用到,好了!就依pe2的习惯设
为F4吧!怎么设?找上面叫出说明档怎么设,您就依样画葫芦就可以了!vim
的设定档在~/.vimrc。个人是直接设成:q!以免麻烦,但要记得存档喔!

[4]前单元[5]次单元[6]目 录

_________________________________________________________________

最后修订日期:2000.05.05
[7]EdwardLee



[1]前单元[2]次单元[3]目 录

大家来学VIM(一个历久弥新的编辑器)[九]

set功能设定


本单元可说是vi(m)的微调功能,可依您个人的喜好做有限度的调整。由於
vim做了相当的扩充,文内主要是述叙vim的设定,但elvis没有的也会标明
。但并不打算一网打尽,只说明重要、常用的部份,其它的可以:h
option-list来查阅。LinuxJournal四月份(April,2000)有一篇关於
configuringVim的文章,有兴趣的朋友也可参考一下,不过依据的版本是vim
5.5版,而非最新的5.6版。


该在何处设定呢?

可在线上做设定,例如:setai或:setnoai,ai是autoindent的缩写,这
样就可以马上改变缩格的设定,但离开vim后就又恢复原状。要永久设定就得
设在设定档中。vim的设定档在:
~/.exrc
~/.vimrc
~/.gvimrcGUI版本
$VIM/vimrc
$VIM/gvimrcGUI版本
*windows版本则在$VIM/_vimrc及$VIM/_gvimrc
*您要把GUI的设定设在~/.vimrc也是可以的,但分开来可能对以后要修
改时会比较找得到地方改。
*那$VIM在哪里呢?/usr/share/vim或/usr/local/share/vim这是编译
时就决定的,但可在~/.profie或~/.bashrc中另设。windows版本可设
在autoexec.bat中。

elvis的则在:

~/.exrc
~/.elvislib/elvis.rc
*windows版本在C:/ProgramFiles/elvis/elvis.rc
*如果您的系统上同时有vim及elvis,则使用~/.exrc要小心,以免互相
影响了设定。好处是可以把共同的设定设在~/.exrc里。
*拜托您一下!设在设定档中时set前当然是不必冒号的。:-)


如何得知目前的设定

:set或:se会显示所有经过修改的部份,就是和预设值不一样的部份。
:setall显示目前所有设定值内容。
:setoption?显示option这设定的目前值。
:setoption直接线上设定,有些设定需加=后加上设定值内容。
:setnooption取消该设定。
*:set后面是可以多重设定的。例如:setautoindentnoconfirm
autowrite,这样三种设定就会同时重设。

您当然可以改设定档来改变设定值。在vim也可以使用:opt[ion]来直接线上
设定,会列出目前的设定,在set这个字上按Enter即可改变设定,或就直接
修改其值亦可,改完后按:q就可以了。在简短说明处按Enter则会叫出该部
份的说明档给您参考,您说方不方便?改好后
:mk[exrc]则会写入~/.exrc档
:mkv[imrc]则会写入~/.vimrc档

当然您得先搞清楚您目前所在目录在什么地方,如果您是在家目录启动的那就不
用担心了,否则找不到您的新.vimrc可不要写信来骂我。:-)elvis可就没这
么方便了,得自行修改~/.exrc或~/.elvislib/elvis.rc


各种set功能说明

autoindent(ai)
自动缩排,也就是说如果本行是从第五个字元开始写的,您按Enter
后游标就会停在次行第五个字元处。预设是不打开的。

autowrite(aw)
档案一有更动就会自动存档。预设不打开。

background(bg)<vim才有>
可设成dark或light,这是两种不同的highlight颜色设定,详见
$VIMRUNTIME/syntax/synload.vim。不过您要更动颜色的设定,最好
是设在~/.vimrc或~/.gvimrc中,原始档最好不要去动她。
*ㄟㄟㄟ,你从没提过$VIMRUNTIME好不好!其实这是最近版本的vim为了
不至安装新版本时把旧版本的一些设定或macro档干掉,所以
$VIMRUNTIME就是$VIM/vimxx,xx就是版本号码啦!例如您使用的是vim
5.6版,那么就是$VIM/vim56。

backup(bk)
是否要backupfile。预设不打开。

writebackup(wb)<vim才有>
在写入档案前先备份一份,和backup的作用不尽相同,请
:hbackup-table。预设是打开的,所以您如果不要backup,那要关
掉的是这个项目,而不是backup。但请先检查一下您编译时是不是
有编译进去,请:ver。

backupdir(bdir)<vim才有>
设定存放backupfile的目录。预设在所编辑的档案之所在目录。

binary(bin)<vim才有>
设在编辑二进位档状态,这是防止存二进位档时把EOL也写进二进位
档,那就会悔不当初,如果是图档将会无法再观看,如果是可执行档就
无法执行了!因此预设是off。
*elvis会自动判断是否为二进位档,而且会分成左右两半,左半部会以16
进位的方式显示,右半部则是以ASCII的方式来显示。

browsedir(bsdir)<vim才有>
浏览档案的目录,GUI版本始有。预设是上一次浏览的目录。就是GUI
版本功能表上的[File]->[Open]会打开的目录。

cindent(cin)<vim才有>
写C时很好用,indent比一般敏感,专为C程式码而设。预设off。
编辑C/C++code时会自动打开。

cmdheight(ch)<vim才有>
状态列的行数,预设一行,建议设成两行。

compatible(cp)<vim才有>
设为和原始vi相容的状态,vim的扩充功能会被抑制。预设off。

confirm(cf)<vim才有>
各种确认动作。预设off。

directory(dir)
swap档存放的目录。前面单元已有说明。

fileformat(ff)<vim才有>
这是写入档案时置放EOL(endofline)的形式
dos是以0D0A来断行。
unix是以0A来断行。
mac是以0D来断行。
预设以各系统平台而定,在Linux当然是unix形式。

fileformats(ffs)<vim才有>
可指定多个,会依载入的档案形式来调整ff。
例如:setffs=unix,dosff=unix
则预设为unix格式,但如读入的是dos格式的档案,会自动调整
为dos格式,这样存档时就会以dos格式存档(状态列会显示)。
。此时如要改成unix格式,可setff=unix然后存档就会转成
unix格式,反之亦然。
*如果不这样设,也就是您不管ff或ffs都设成unix,那读入dos格式
的档案时在每行尾会出现^M这个字元(就是0D啦!)这时纵使:set
ff=unix也来不及了!只好:%s/^M//g来消去这个^M。ㄟ,还记得怎么替
换吗?就是把^M换成没有啦!而且^M怎么打出来的还记得吧!翻一翻前
面的单元吧!
*Hey,你怎么知道是0D呀!好吧!告诉您一个密秘,您把游标移到^M那
个位置,然后按ga在状态列就会显示10,16,8进位的值。其它的字元
也是可以如此显示。a就是ascii的意思。但这是vim的扩充功能
,elvis没有。
*elvis纵使载入dos格式的档案,也是会自动把^M隐藏起来。

ignorecase(ic)
寻找时不分大小写,这对中文会造成困扰。预设off。

incsearch(is)<vim才有>
加强式寻找功能,在键入patern时会立即反应移动至目前键入之
patern上。预设off。

hlsearch(hls)<vim才有>
寻找时,符合字串会反白表示。预设off。如果您是使用vim的
预设的vimrc档的话,会设在F8键来切换。

textwidth(tw)
是一种wordwrap的功能,从左起算之固定每行的最大字元宽度。
超过此宽度就会自动折行,这可是真的折行,也就是说在折行处会插
入EOL。预设是0,也就是没有wordwrap的功能。

wrapmargin(wm)
和textwidth作用相同,只是是从右视窗边向左算起要几个字元起
折行。预设是0。textwidth与wrapmargin的功能目前并不适用於
中文,打中文还是您自行按Enter吧!

wrap
这也是折行功能,可是只是萤幕效果的折行,实际上并没有插入EOL。

wrapscan(ws)
这和折行没有关系,是指寻找时,找至档尾时,是否要从档首继续找。
预设是要。

paste<vim才有>
这是防止在做剪贴时位置会不正确,前面单元已有说明。

ruler(ru)<vim才有>
会在状态列显示游标所在处之行列状态,预设不打开,但建议打开。
最右边之代号的意义如下:
Top档案第一行在萤幕可见范围。
Bot档案最后一行在萤幕可见范围。
All档案首尾皆在一个萤幕范围内。
如非以上三种情形,则会显示相对百分比位置。

statusline(stl)<vim才有>
状态列显示的格式,使用预设就可以了,如果您想骚包一下的话,那
就请您:hstl。

shiftwidth(sw)
指由>>移动整行内容时,一次移动的字元宽度,一般是使用Tab的
值,但可由这个设定来改变。

tabstop(ts)
一个Tab键宽度。预设是8个字元宽度。最好不要随便改,以免您写
的东西由其它编辑器来阅读时造成困扰,为解决这个问题,vim有一种
softtabstop的机制,在下一节会详细说明。

showcmd(sc)
在状态列显示目前所执行的指令。

showmode(smd)
在状态列显示目前的模式,例如是Insertmode或是Visualmode。
当然平常的normalmode(commondmode)是不显示的。

viusalbell(vb)<vim才有>
以萤幕闪动代替beep声。

number(nu)
显示行号。注意,冒号命令也有:nu这是显示游标所在行的行号,您
嫌多打一个字的话,:#也行。不过如果ruler打开的话,在状态列本
就会显示门前游标所在处的行列值。

list
这也可以算是一种模式,listmode。就是Tab的地方会以^I显示,
而行尾之EOL会显示成$。可以让您清楚的知道Tab在哪里,折行是
不是真的。

swapfile(swf)<vim才有>
是否需swap至磁碟。如果设为noswf的话,那将不会有swapfile
产生,通通会载入在记忆体中。预设是要swapfile。

fileencoding(fe)<vim才有>
首先先鼓掌一下,啪啪啪…,因为有支援taiwan,也支援XIM,也
就是说可以使用xcin-2.5x来作输入,当然您用xcin-2.3x配合
XA也是可以啦!目前支援简繁中文、日文、韩文,unicode尚未植
入。但前提是您要把multi_byte编译进去,这在一开始就讲过了。
预设是使用ansi。setguifont及setguifontset已在一开始讲
过,在此就不重复了。

history(hi)
记录冒号命令的历史纪录档,就是可以用上下方向键叫出来的那锅。
预设是20笔。


关於softtabstop(sts)

几乎所有的OS及软体都设定Tab就是8个字元长,这已经是个公认值,您硬
要去改变它的话恐怕带来许多不便,但实际上关於程式风格,许多人又认为8
个字元太长了,几个巢状回圈下来就需折行,反而不方便。因此vim体贴您,
内建了softtabstop的功能,就是由vim来代您制造出一个假的Tab,实际上
是空白字元组成的Tab。

举个例子来说明比较清楚。
setsofttabstop=4
setshiftwidth=4

这样会由4个空白字元取代一个Tab,您按Tab键vim就跳4格,需注意的
是,如果您按了三次Tab键,那就是一个实际的Tab加上四个空白字元,可不
是12个空白字元喔!是混合Tab及space的。

问题来了!那我要按真正的8字元的Tab时怎么办?简单,还记得怎么按特殊
字元吗?Ctrl-vTab或Ctrl-vI就可以了,那就是如假包换的8字元长之
Tab。当然,您按两次Tab不就得了!:-)


关於折行

前面已说过setwrap就可以造成萤幕折行,可是却会把一个英文单字折成两半
,实在很不雅观。好了,vim再体贴您一次,setlinebreak(lbr)就会避免这
种问题发生,会在空白或标点符号的地方来折行,但也仍属萤幕折行,并不会插
入EOL。这个功能目前在中文判断上还是会出槌!:-(

[4]前单元[5]次单元[6]目 录

_________________________________________________________________

最后修订日期:2000.04.06
[7]EdwardLee




[1]前单元[2]目 录

大家来学VIM(一个历久弥新的编辑器)[十]

规则表示式的运用


在本系列文章一开始就说明了学vi(m)可以顺便学规则表示式(regular
expression,以下简称regexp),那为什么到现在才来讲呢?因为regexp说
简单也算不很难,但您要深入去使用的话,有时会马上看不出一个复杂的
regexp在说些什么的,就曾有人形容regexp为「有字天书」!而且在vi(m)
整体都还没一个概念就加入regexp的话,那后面的单元恐怕就没人看了!而
regexp各家有各家的extensions,这也是大家视为畏途的原因之一,不过总是
大同小异,只需注意一下就可以了。目前先不必管别家怎么说,就让vim暂时
先成为我们的「标准」,以后碰到其它程式的regexp应该就可以触类旁通。以
下我们尽量由实例去了解。当然,小小的一篇文章是没有办法详尽介绍,只能捡
重点来说明了。如有疑问,可:hpattern或在Un*x系统中可man7regex,
甚至maned,mansed,mangrep,manawk,manperlre里面也是会说些
regexp,但要注意和vim差异的地方!其中perl的regexp应该是最完整的
了,如果您的系统没有perl那应该是「稀有动物」了!:-)ㄟㄟㄟ!vim只是
一个编辑器,可不是独立的程式语言!


基本的匹配

*指前所绑住的字元或字元集合,出现0次或0次以上。
/+和*作用相同,但不包括出现0次。
/=指前所绑住的字元恰好出现0或1次。
/|这是多选,就是or的意思,被/|隔开的pattern,任一个符
合的话就算符合。
*/+,/=,/|会加上一个/,是因原字元在vi(m)就具有特殊意义,在一般
的regexp中是+,?,|就可以了,只是提醒您一下,以免搞混了!
*记住* /+是不可数的!用辞不是是精确,只是帮助您记忆啦!
*在elvis及ed中是使用/?来匹配出现0或1次,而不是/=,这里要
非常小心!

[实例]dg*
指*前所绑住的字元g出现0次或0次以上。也就是说d(出现0次),dg
,dgggg,dgggggggg都是符合这个pattern。如果您下寻找指令/dg*,那符合
这个pattern的字串都会被找出来。如果用在代换就要非常小心了,像
extended中的d也是会被置换掉的。例如您下:%s/dg*/test/g的话,那
extended这个字会换成extentestetest。

*shell中使用的通用字元为patternmatchingnotation和regexp不同
的。dg*在shell中是解为以dg开头的任意字串,这就不包括d在内了
,也就是说在shell中,*是代表任一字元或字串。

[实例]dg/+
dg,dgg,dgggggg皆符合,但d则不符合。如果是dg/=的话,就只有d、dg
这两个符合了。

[实例]:%s/The/|All/test/g
全文中只要是The或All都会被替换成test。注意,如果文中有There也是
会被替换成testre!要如何避免这种情形呢?下面会另述及限定使用法。

[实例]/123-/=4567
这样会找出,123-4567及1234567。当然123-456789也是会被找出来。

[...]字元集合,表示中括号中所有字元中的其中一个。
[^..]这是上述[...]的补集,表非中括号内字元的其中一个。
.除换行字元外的任一单一字元。指本身,非指前所绑之字元。
就好像shell中的?一样。如果要指定真正的英文句点,要
用/来escape,就是说/.这时的.是代表真正句点,而不
是regexp中的特殊意义。其他如/*亦同。

[实例]

[Aa]
A或a其中的一个。

[12345]
12345其中的一个数目字。可用[1-5]来表示。连续性的数目字或字元
可用-来隔开,写出头尾来代表就可以了。[0-9]就表0到9的数目
字,[a-d]就代表abcd四个英文字母

[实例]W[0-9]*/.cc
这个例子是说以W开头,后接0-9其中一个或多个数目字或不接什么,然后是
一个句点,最后是cc。所以W.cc,W1.cc,W2.cc,W345.cc,W8976543287.cc
皆符合。如果要表示W及.cc间夹一个以上的数目字,要写成
W[0-9][0-9]*/.cc。

[实例].*
这代表任意字元或字串,或什么都没有,脑筋急转弯,对照前面的定义想一下。
当然这是不包括换行字元的。

[实例]
[^M] 表除M以外的任意字元。
[^Tt] 表T及t以外的任意字元。
[^0-9] 表非数目字之字元。
[^a-zA-Z] 表非英文字母之字元。

*注意,^要在中括号内,且在最开头的地方,否则另有含意。

^匹配行首,指其后绑住的字串,出现在行首才符合。
$匹配行尾,指其前绑住的字串,出现在行尾才符合。含换行字元。
*不是在行首的^指的是^这个字元。不是在行尾的$是指$本身这个字
元。

[实例]/^What
这样只有在行首的What才会被找出来。注意!Whatever,What's也是会被找
出来。如果是/What$则是在行尾的What才会被找出来。

[实例]^$
这是什么东东?行首也是行尾的行。ㄚ,就是空白行嘛!当然也不能说这个行是
没有什么东东啦!空白行至少也是会有个换行字元。在后面会详述如何消除全文
的空白行。

/(.../)记忆pattern,可由/1,/2.../9来叫出。

[实例]:%s//([a-z]/)/1/test/g
这样aa,bb,cc,dd,...,zz都会被test替换掉。这和
:%s/[a-z][a-z]/test/g是不一样的意思,后者会把aa,ab,ac...ba,bb,
bc...zz都换成test。也就是说/(.../)由/1叫出时会有对称性的配对出现


[实例]:%s//(./)/(./)r/2/1/test/g
会将中间为r,前有二个任一字元,后有两个具对称性的字元所组成的字串替换
成test。/2是呼叫第二组/(./),而/1是呼叫第一组/(./)。例如:12r21
,cfrfc,7grg7等都会被替换成test。

/<匹配字(word)首。所谓word包括文数字及底线。
/>匹配字尾。这就是前所提及的限定用法,被/<,或/>括住的
pattern就会被限制住,使regexp不能再向右(左)扩充解释。
*ed及perl中可以/b来表示这两个符号,perl中只支援/b,ed则/b
及/<,/>皆支援。但在perl可多加个?来限制regexp的扩充解译。
*功能上而言,这是和^$一样的定位样式(anchorpattern)指所绑住的
字串必须是单字边界(wordboundary),前或后或前后除了空白字元及标
点符号外不可再有其它字元。
*在vim中/b是表示<BS>即backspace键。

[实例]:%s//<abbbc/>/test/g
这样只有abbbc才会被替换成test。如果没有这样限定,:%s/abbbc/test/g,
那deabbbcly中的"abbbc"亦会被替换成test。所以前面
:%s/The/|All/test/g可换成:%s//<The/>/|/<All/>/test/g这样一来,There
就不会被替换成testre了!

[实例]:%s//<abbbc/test/g
这样的话,只要是以abbbc为首的字(word),其中的abbbc的部份都会被
test所替换。注意!是指字首,而不是指行首。所以abbbc,abbbcerd
,abbbckijuds都符合。

/{n,m}指前所绑住的字元或字元集合最少出现n次,最多出现m次。
*这在一般的regexp表示成/{n,m/}。vim及elvis两种表示法皆支援
。perl则直接使用{}。以下会举四种不同的例子,请大家发挥一下想像力
。:-)

[实例]/{最小值,最大值}
如[0-9]/{3,4}匹配至少三位数,但不可多於四位数的数目字。如:
123
12
1
123456
1234567
12345678
1234
12345

如果下:%s/[0-9]/{3,4}/test/g的话,那1,12这两组不会被替换,因为不
满3位数。而12345,则会换成test5。123456,则会换成test56。12345678
,则会换成testtest。1234567也是会换成testtest。123,1234这两组则会
被替换成test。您可以亲自操作一次就知道怎么一回事了。操作时最后加gc
来confirm,这样您会更了解实际替换的内容。ㄟ,别忘了u可以回复您的编
辑动作。

[实例]/{数目字}
xy/{20} 表示x后接20个y。
e[x-z]/{4} 表示e后接有四个字元,是x,y,z的其中一个的
     组合。如:exxxx,exyyz,ezzyz,exyzz皆符合。

[实例]/{最小值,}
xy/{2,} 表x后接至少二个的y。相当於xyyy*或xyy/+。

[实例]/{,最大值}
xy/{,4} 表x后接至多四个或更少的y(可能没有)。
    因此x,xy,xyy,xyyy,xyyyy皆符合。


中介字元(metacharacter,orcharacterclasses)

主要是简化regexp的书写。
/s表空白字元,即<Space>或<Tab>。
*不含换行字元,这是编辑器的特性使然。在perl的/s是包含换行字元的
。而且vim及elvis皆不支援/n这种换行中介字元。

/S表非空白字元。
/d表数目字(digits),即[0-9]。
/D表非数目字,即[^0-9]。
/w表一般字元(wordcharacter),包括底线。即[0-9a-zA-Z_]。
/W表非一般字元,即[^0-9a-zA-Z_]。
/a表英文字母(alphabeticcharacter),即[a-zA-Z]。
/A表非英文字母,即[^a-zA-Z]。
/l表小写字母(lowercasecharacter),即[a-z]。
/L表非小写字母,即[^a-z]。
/u表大写字母(uppercase),即[A-Z]。
/U表非大写字母,即[^A-Z]。
*原始vi不支援此种中介字元。
*使用中介字元的比对速度将会比使用字元集合[]的快。


全域性的指令

:[range]g/pattern/[cmd]

cmd是ed可用的指令,预设是p(print),您可查一下maned,就可以知道有
什么指令可用。这个小节里主要是说明d(delete)的功能。因为是要说明如何
消除空白行。需注意的是,d是行删除指令,凡含pattern的整行都会被删掉
,而且range不指定的话,预设是全篇文章,因为g就是代表globe。
*在vim的help档里说的是ex指令,但ex实际上是和vim连结的,因
此这里特别指出ed。但ed的指令少数可能会和vim的ex不同,这是因
为ed和vim并非同步在发展,作者也非同一人。

:g/^$/d

这样就会删除全文的空白行。前面已提过^$代表的是空白行。但这里有个问题
,如果空白行里包含了其它空白字元(即Space或Tab)的话。表面看起来是
和一般空白行一模一样,但却暗藏玄机,用上面的方法就无法删除这种空白行了
!怎么办?来!看招!
:g/^[<Space><Tab>]*$/d

在vim或elvis里您可以如此照打,也就是<Space>代表空白字元,<Tab>
代表按Tab键的结果。在原始vi则不行,得自行按出特殊字元出来,就是
Ctrl-vSpace及Ctrl-vTab。或采更简单的打法:
:g/^/s*$/d

还记得中介中元吗?好用吧!少打了不少字。:-)意思就是删除含0或1个以
上空白字元的行。

有些书中写成:%s/^$//g可以删除空白行,这是错误的,因为:s这个指令只
更动一行里的内容物,但不会做删除一行的动作。


&替代变数

代表置换时合於patern的字元或字串。

[实例]:%s//u/d/d/d/d/d/d/d/d/d/>/ID:&/g
这样全文中的身份证字号前就会加上ID:字样,也就是说T123456789会被换
成ID:T123456789。还记得吗?/d就是[0-9],/u代表大写的英文字母。加
个/>是防止T12345678999也被换掉。当然前面再加个/<更保险。ID:字样
您用中文也行!
另一个好用的例子是电话号码前加上TeL:,就请您自行练习了!

[实例]将档案3至7行的资料向右移2个空白
:3,7s/.*/&/

但这样连空白行也是会插入空白字元,较高明的做法是:
:3,7s/./+/&/

这样空白行就不会去动它了!想通了.*及./+的意思了吗?往前翻一下.*
/+的定义。

[实例]将档案3至7行的资料向左移2个空白
:3,7s/^//

就是删去行首的二个空白啦!

[实例]将全文的Edward这个单字,前后加上中括号
:%s//<Edward/>/[&]/g

[实例]将全文的Edward这个单字,改成大写的。
:%s//<Edward/>//U&/g

*ㄟ!/U不是代表非大写字母吗?喔!您搞错位置了。/U在pattern的位
置的时候是指非大写字母的样式,即[^A-Z],但如果是在置换字串位置的
时候是指将其后的字串通通改成大写。与其相对的是/L,会将其后的字串
改为小写。详细请:hsub-replace-special。

[实例]将全文每行最后加上<BR>这个HTMLtag。
:%s/.*/&<BR>/g

怎么样,是否已感觉到regexp威力无穷了呢?还是您已经快睡著了呢?:-)不
过也请您想想,如果是在没有regexp功能的编辑器里,范例中的一些动作您会
怎么做呢?一个一个去改?


greedy陷阱

regexp会有贪心的倾向,什么意思呢?就是说在同一行内,如果有多个符合
pattern的情形,会找最长的那一个。
*注意!greedy的特性是针对会反覆比对的regexp而言,例如:*,/=,
/+,/{}等。前面所举的.*的例子,由於greedy的关系,在整篇文章中
做替换时,会被当成是每一行整行,因为regexp会去找每一行最长符合的
那一个。

[实例]Thisisatest.Testforregexp.
如果您下:%s/[Tt].*t/program/g原意是想把所有的Test或test换成
program的,结果由於regexp的贪心,整个"Thisisatest.Test"会换成
program。结果原文就变成了programforregexp.因此在全文替换时要非常小
心,避免使用弹性太大的regexp。像此例,只要下
:%s//<[Tt]est/>/program/g就可以了!


最后提醒您,这可不是regexp的全部,碍於篇幅及在下功力的问题,当然是没
办法全面详尽的向各位做介绍,在下只是将各位领进门,修行就得看各位了!如
果还想更深入的研究regexp,可参考:MasteringRegular
Expressions(O'Reilly&Associates)一书。

[3]前单元[4]目 录

_________________________________________________________________

最后修订日期:2000.05.05
[5]EdwardLee

分享到:
评论

相关推荐

    vim帮助文档-大家来学VIM(一个历久弥新的编辑器)

    大家来学VIM(一个历久弥新的编辑器)[一] 前言 监於仍有许多人还没找到顺手的编辑器,而许多想学 vi 的人又觉得无从下手,因此在此提出一些个人的心得,希望能对这些朋友有点帮助。或许也减少一点 FAQ 吧! ...

    大家来学vim(简体-05).pdf

    大家来学vim(简体-05).pdf 鉴于仍有许多人还没找到顺手的编辑器,而许多想学 vi 的人又觉得无从下手,因此在此提出一 些个人的心得,希望能对这些朋友有点帮助。或许也减少一点 FAQ 吧! 真要深入的话,大多数的前辈...

    大家来学VIM

    是台湾同胞写的一份VIM学习教程。虽仅75页,但内容超级殷实。郑重推荐。

    大家来学Vim.pdf

    大家来学VIM.pdf 中文繁体版,可作为初学VIM的教程

    大家来学 vim pdf 中文

    vim 编辑器是linux unix 中最常用的编辑器了,这个pdf教程是一个很好的教程,有例子

    大家来学vim简体中文版

    大家来学vim的简体中文版本,根据繁体中文版翻译过来

    学习vi和vim编辑器

     将近三十年的时间里,vi一直是unix与linux采用的标准编辑器,从1986年开始,《学习vi和vim编辑器(第7版)》一直是第一线的vi导引手册。但三十年来,unix已不再是三十年前的样子,这本书也不能一成不变。第7版的...

    《大家来学vim》-李果正

    李果正教授的《大家来学vim》 41页,可以作为学习手册来使用。

    大家来学vim linux下最好的编程工具

    大家来学vim 大家来学vim 大家来学vim 大家来学vim

    学习vim 编辑器 第7版

    学习vim 编辑器,最新版,vim学习必看。包含了vim的各种使用技巧。

    文本编辑器Vim 文本编辑器Vim

    文本编辑器Vim 文本编辑器Vim 文本编辑器Vim 文本编辑器Vim 文本编辑器Vim 文本编辑器Vim 文本编辑器Vim 文本编辑器Vim

    学习VI和VIM编辑器第7版中文

    将近三十年的时间里,vi一直是Unix与Linux采用的标准编辑器,从1986年开始,《学习vi和Vim编辑器》一直是第一线的vi导引手册。但三十年来,Unix已不再是三十年前的样子,这本书也不能一成不变。第7版的《学习vi和Vim...

    学习vi和vim编辑器_第7版_中文+英文_PDF

    《学习vi和Vim编辑器(中文版第7版)》将说明使用这两种程序编辑文档的基础技巧,并讨论高级工具,例如交互式宏与扩展编辑器的脚本——我们的内容编写成容易遵循步骤操作的风格,成就本书的经典地位。读者将学到: ·...

    大家来学vim(RedHat下的文本编辑器学习用书)

    台湾李果正出的一本关于linux下vi操作的书,开源原版书!

    VIM编辑器 安装包

    Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性。 [1] VIM是自由软件。 Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Emacs的不同变体。1999 年...

    基于C/C++语言的简易vim编辑器 仿vim编辑器

    # 基于C/C++语言的简易vim编辑器 仿vim编辑器 1. 编辑器下有normal和insert两种模式。默认为normal模式,按i键进入insert模式,按esc退出insert模式。 2. normal模式下按 h j k l键向左上下右移动光标。 3. normal...

    学习vi和vim编辑器.pdf_vim实用_vi_vim_

    vi和vim编辑器的使用和进阶说明,非常实用

    学习vi和vim编辑器_第7版_中文

    将近三十年的时间里,vi一直是Unix与Linux采用的标准编辑器,从1986年开始,《学习vi和Vim编辑器》一直是第一线的vi导引手册。但三十年来,Unix已不再是三十年前的样子,这本书也不能一成不变。第7版的《学习vi和Vim...

    学习vi和Vim编辑器_CN.pdf

    学习vi和Vim编辑器_CN.pdf pdf 中文 完美版

    Vim编辑器使用教程(官方中文版)

    vim编辑器大家应该都不陌生,这是翻译小组翻译的vim的官方教程。。。

Global site tag (gtag.js) - Google Analytics