9 . set功能设定本单元可说是V im的微调功能,可依您个人的喜好做有限度的调整。由于V im做了相当多的扩充,文内主要是述叙V im的设定,但elvis没有的也会标明。但并不打算一网打尽,只说明重要、常用的部份,其它的可以:h option-list来查阅。
在系统上,会有个vimrc_example.vim档,可以依据这个档案来设定一些常要用到的内容。
9 . 1该在何处设定呢?
可在线上做设定,例如:set ai或:set noai,ai是autoindent的缩写,这样就可以马上改变缩格的设定,但离开vim后就又恢复原状。要永久设定就得设在设定档中。vim的设定档在:
~/.exrc ~/.vimrc ~/.gvimrc GUI 版本$VIM/vimrc 系统预设值,最好不去修改$VIM/gvimrc GUI 版本$VIM\_vimrc Windows 版本$VIM\_gvimrc
您要把GUI的设定设在$HOME/.vimrc也是可以的,但分开来可能对以后要修改时会比较找得到地方改。那$VIM在哪里呢?/usr/share/vim或/usr/local/share/vim这是编译时就决定的,但可在$HOME/.bash_profie或$HOME/.bashrc中另设。Windows版本的$VIM则在C:\Vim这个目录中,亦可设在autoexec.bat中。
~/.exrc ~/.elvislib/elvis.rc C:\Program Files\elvis\elvis.rc Windows 版本
如果您的系统上同时有V im及elvis,则使用$HOME/.exrc要小心,以免互相影响了设定。好处是可以把共同的设定设在$HOME/.exrc里。提醒您一下!设在设定档中时set前当然是不必冒号的。
~/.exrc ~/.nexrc
9 . 2如何得知目前的设定
:set 或:se 会显示所有经过修改的部份,就是和预设值不一样的部份。:set all 显示目前所有设定值内容。:scriptnames 显示各种设定档的所在路径及其档名。:set opt??ion? 显示option 这设定的目前值。:option 直接线上设定,有些设定需加= 后加上设定值内容。:set nooption 取消该设定。:set 后面是可以多重设定的。例如:set autoindent noconfirm autowrite,这样三种设定就会同时重设。
您当然可以改设定档来改变设定值。在V im也可以使用:opt[ion]来直接线上设定,会列出目前的设定,在set这个字上按Enter即可改变设定,或就直接修改其值亦可,改完后按:q就可以了。在简短说明处按Enter则会叫出该部份的说明档给您参考,您说方不方便?改好后
:mk[exrc] 则会写入~/.exrc 档:mkv[imrc] 则会写入~/.vimrc 档
当然您得先搞清楚您目前所在目录在什么地方,如果您是在家目录启动的那就不用担心了,否则找不到您的新.vimrc可不要写信来骂我。:-) elvis可就没这么方便了,得自行修改$HOME/.exrc或$HOME/.elvislib/elvis.rc。
9 . 3各种set功能说明
方括号内的是缩写,由于V im新增的指令、设定项实在是相当多,建议一开始使用完整的写法,等熟悉后再来使用缩写会比较好。
自动缩排,也就是说如果本行是从第五个字元开始写的,您按Enter后游标就会停在次行第五个字元处。预设是不打开的。档案一有更动就会自动存档。预设不打开。可设成dark或light,这是两种不同的highlight颜色设定,系统预设的内容是在一个synload.vim档中,详见$VIMRUNTIME/syntax/synload.vim。不过您要更动颜色的设定,最好是设在$HOME/.vimrc或$HOME/.gvimrc中,原始档预设档尽量不要去动她。ㄟ ㄟ ㄟ ,你从没提过$VIMRUNTIME好不好!其实这是最近版本的V im为了不至安装新版本时把旧版本的一些设定或macro档干掉,所以$VIMRUNTIME就是$VIM/vimxx,xx就是版本号码啦!例如您使用的是V im 6.1版,那么就是$VIM/vim61,往后安装6.2版时,会把runtime files装在$VIM/vim62,这样就不会把旧的runtime files给盖掉。
是否要backup file。预设不打开。在写入档案前先备份一份,和backup的作用不尽相同,请:h backup-table。预设是打开的,所以您如果不要backup,那要关掉的是这个项目,而不是backup。但请先检查一下您编译时是不是有编译进去,请:ver。设定存放backup file 的目录。预设在所编辑的档案之所在目录。设在编辑二进位档状态,这是防止存二进位档时把EOL 也写进二进位档,那就会悔不当初,如果是图档将会无法再观看,如果是可执行档就无法执行了!因此预设是off。elvis 会自动判断是否为二进位档,而且会分成左右两半,左半部会以16 进位的方式显示,右半部则是以ASCII 的方式来显示。浏览档案的目录,GUI版本始有。预设是上一次浏览的目录。就是GUI版本功能表上的[File] 234 [Open]会打开的目录。写C 时很好用,indent 比一般敏感,专为C 程式码而设。预设off。编辑C/C++ code 时会自动打开。状态列的行数,预设一行,建议设成两行。设为和原始vi相容的状态,vim的扩充功能会被抑制。预设off。各种确认动作。预设off。swap 档存放的目录。前面单元已有说明。这是写入档案时置放EOL(end of line) 的形式dos 是以0x0D0A 来断行。unix 是以0x0A 来断行。mac 是以0x0D 来断行。
预设以各系统平台而定,在Linux 当然是unix 形式。可指定多个,会依载入的档案形式来调整ff。例如:set ffs=unix,dos ff=unix
则预设为unix格式,但如读入的是dos格式的档案,会自动调整为dos格式,这样存档时就会以dos格式存档(状态列会显示)。。此时如要改成unix格式,可:set ff=unix然后存档就会转成unix格式,反之亦然。如果不这样设,也就是您不管ff或ffs都设成unix,那读入dos格式的档案时在每行尾会出现^M这个字元(就是0x0D啦!)这时纵使:set ff=unix也来不及了!只好:%s/^M//g来消去这个^M。ㄟ ,还记得怎么替换吗?就是把^M换成没有啦!而且^M怎么打出来的还记得吧!翻一翻前面的单元吧!
Hey,你怎么知道是0x0D呀!好吧!告诉您一个密秘,您把游标移到^M那个位置,然后按ga在状态列就会显示10,16,8进位的值。其它的字元也是可以如此显示。a就是ascii的意思。但这是V im的扩充功能,elvis没有。elvis纵使载入dos格式的档案,也是会自动把^M隐藏起来。
寻找时不分大小写,这对中文会造成困扰。预设off。加强式寻找功能,在键入patern 时会立即反应移动至目前键入之patern 上。预设off。寻找时,符合字串会反白表示。预设off。如果您是使用vim的预设的vimrc档的话,可设在F8键来切换。是一种word wrap 的功能,从左起算之固定每行的最大字元宽度。超过此宽度就会自动折行,这可是真的折行,也就是说在折行处会插入EOL。预设是0,也就是没有word wrap 的功能。和textwidth 作用相同,只是是从右视窗边向左算起要几个字元起折行。预设是0。这也是折行功能,可是只是萤幕效果的折行,实际上并没有插入EOL。这和折行没有关系,是指寻找时,找至档尾时,是否要从档首继续找。预设是要。这是防止在做剪贴时位置会不正确,前面单元已有说明。会在状态列显示游标所在处之行列状态,预设不打开,但建议打开。最右边之代号的意义如下:Top 档案第一行在萤幕可见范围。Bot 档案最后一行在萤幕可见范围。All 档案首尾皆在一个萤幕范围内。
如非以上三种情形,则会显示相对百分比位置。状态列显示的格式,使用预设就可以了,如果您想骚包一下的话,那就请您:h stl。指由?移动整行内容时,一次移动的字元宽度,一般是使用Tab的值,但可由这个设定来改变。一个Tab键宽度。预设是8个字元宽度。最好不要随便改,以免您写的东西由其它编辑器来阅读时造成困扰,为解决这个问题,V im另有种softtabstop及modeline的机制,在以下各节会详细说明。在状态列显示目前所执行的指令,未完成的指令片段亦会显示出来。在状态列显示目前的模式,例如是Insert mode 或是Visual mode。当然平常的normal mode(commond mode)是不显示的。在载入档案的同时,会在这个地方显示档案名称及其总行数、总字元数。以萤幕闪动代替beep 声。显示行号。注意,冒号命令也有:nu这是显示游标所在行的行号,您嫌多打一个字的话,:#也行。不过如果ruler打开的话,在状态列本就会显示门前游标所在处的行列值。这也可以算是一种模式,list mode。就是Tab的地方会以^I显示,而行尾之EOL会显示成$。可以让您清楚的知道Tab在哪里,折行是不是真的。是否需swap 至磁碟。如果设为noswf 的话,那将不会有swapfile 产生,通通会载入在记忆体中。预设是要swapfile。首先,先鼓掌一下,啪啪啪……,因为有支援Taiwan,也支援XIM,也就是说可以使用xcin-2.5x 来作输入,当然您用xcin-2.3x 配合XA 也是可以啦!但前提是您要把multi_byte 编译进去,这在一开始就讲过了。预设是使用ansi。set guifont 及set guifontset 已在一开始讲过,在此就不重复了。记录冒号命令的历史纪录档,就是可以用上下方向键叫出来的那锅。预设是20 笔。
9 . 4关于softtabstop[sts]
几乎所有的OS及软体都设定Tab就是8个字元长,这已经是个公认值,您硬要去改变它的话恐怕带来许多不便,但实际上关于程式风格,许多人又认为8个 ??字元太长了,几个巢状回圈下来就需折行,反而不方便。因此V im体贴您,内建了softtabstop的功能,就是由V im来代您制造出一个假的Tab,实际上是空白字元组成的Tab。
举个例子来说明比较清楚。
set softtabstop=4 set shiftwidth=4
这样会由4个空白字元取代一个Tab,您按Tab键vim就跳4格,需注意的是,如果您按了三次Tab键,那就是一个实际的Tab加上四个空白字元,可不是12个空白字元喔!是混合Tab及Space的。
问题来了!那我要按真正的8字元的Tab时怎么办?简单,还记得怎么按特殊字元吗?Ctrl+v Tab或Ctrl+v I就可以了,那就是如假包换的8字元长之Tab。当然,您按两次Tab不就得了!:-)
另一个更大的问题也来了!在Un*x系统的有些设定档,例如Makefile, snedmail的设定档,他们会认真正的Tab,因此如果您有程式开发或系统管理的需要的话,最好是不要随意更动Tab值,也不要使用softtabstop,可以使用V im独特的modeline来控制,请继续研读下一节。
9 . 5 V im的modeline
这个是什么哇?简单的说,V im有能力去解读所编辑档案内的V im控制参数,而这些控制参数是写在档案的注解行里头的,例如sh script的注解行是以#来开头的,那V im的控制参数就可以写在这些注解里头,V im在开这个档的同时,也会去控制自己的一些行为,当然,包括了上一节所说的Tab的长短,而shell本身则会忽略这些注解。
例如,现在把一个sh script 档里头,在档案最后一行,设了个:
# vim: ts=2
这样一来,按个Tab,实际上显示出来会只有两个空格,别担心仍然是正港Tab,不相信的话,可用另一种编辑器打开就知道了。这个好用吧!详细请进入vim后:h modeline。
当然,这个功能很方便,但并不是全然没有限制的,以下有些限制要注意:
1. 控制modeline 本身的设定,不能写在档案里头,vim 会来不及读他。例如:在sh script 档案中设定# vim: set modelines=0 这是行不通的。2. 这些设定必须要在档案的开头五行,或结尾五行内设定,否则vim 会忽略。3. 注解符号后要至少一个空白(sapce 或Tab 皆可)隔开。例如: /* vim:noai:sw=3 ts=4 */ => C 程式码/* 和vim 间至少要有个空白// vim:ts=2 => C++ # vim:ts=2 => sh script, perl, python, tcl " vim:ts=2 => vim script
9 . 6关于折行
前面已说过set wrap就可以造成萤幕折行,可是却会把一个英文单字折成两半,实在很不雅观。好了,V im再体贴您一次,:set linebreak(lbr)就会避免这种问题发生,会在空白或标点符号的地方来折行,但也仍属萤幕折行,并不会插入EOL。
在一般的文书排版处理,甚至是写程式码,设定系统的设定档,这些时机,可能自动折行并不很适合(指会插入EOL的),很容易把写好的内容,因为一个不小心就都弄乱了,因为程式一般是一行一行在读的,把一整行分成两半,所读的结果就不一样了,除非加入程式码的折行标志,例如一般的倒斜线9 . 1 \或TeX / LaTeX的百分号%。而在排版软体如TeX / LaTeX,插入EOL的折行,会造成中文字间多出个空白,这在HTML格式的档案亦同,因此,在做折行的决定时,也请考虑一下其他的『副作用』。
9 . 7我的设定档
以下是我个人的设定档,仅供参考用:
" ~/.vimrc by Edward GJ Lee " 这个记号就是vim 的注解,通常情形vim 会忽略。" This code is Public Domain " set backspace=indent,eol,start set autoindent " always set autoindenting on set history=50 " keep 50 lines of command line history set ruler " show the cursor position all the time set showcmd " display incomplete commands set enc=big5 " 档案编码设成big5 "使用:update 代替:w,以便在有修改时才会存档,注意,这和vi 不相容。map
" ~/.gvimrc by Edward GJ Lee " This code is Public Domain " set mousehide " 当输入文字时隐藏mouse map
其实,一些设定档除了家目录下的.vimrc及.gvimrc外,可以置放于家目录下的一个子目录.vim,其目录结构可以仿$VIMRUNTIME这个系统上的结构。例如,我的.vim结构如下:
edt1023:~$ tree .vim .vim |-- filetype.vim |-- plugin | |-- format.vim | `-- tex.vim |-- syntax | |-- lily.vim | `-- svg. vim `-- view `-- ~=+bg5.txt= 3 directories, 6 files
其中,filetype.vim会在系统的filetype.vim载入后盖过去,也就是家目录的会先优使用。format.vim及tex.vim是进入vim马上会载入的V im script,主要用于中文重排及TeX / LaTeX排版系统编辑时的方便指令、按键。lily.vim则是GNU LilyPond这个乐谱排版系统档案的语法颜色定义档,svg.vim则是SVG向量图档的语法颜色定档加强版。那view那个子目录下的又是什么呢?这是下:mkview指令时所存的一些状态档,在:loadview要参考到,请参考第11章,第11.1.3小节,页
,这个档是个隐藏档。