您的位置:首页 > 理论基础 > 计算机网络

vim set 转自http://blog.sina.com.cn/s/blog_7ae240850100x7ov.html

2014-08-11 09:39 399 查看
vim set 功能设定 
9. set 功能设定
本单元可说是 Vim 的微调功能,可依您个人的喜好做有限度的调整。由于 Vim 做了相当多的扩充,文内主要是述叙 Vim的设定,但 elvis 没有的也会标明。但并不打算一网打尽,只说明重要、常用的部份,其它的可以 :h option-list来查阅。
在系统上,会有个 vimrc_example.vim 檔,可以依据这个档案来设定一些常要用到的内容。

9.1 该在何处设定呢?
9.1.1 Vim 的设定檔
可在在线做设定,例如 :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 中。
9.1.2 elvis 的设定檔
~/.exrc
~/.elvislib/elvis.rc
C:\Program Files\elvis\elvis.rc  Windows版本
如果您的系统上同时有 Vim 及 elvis,则使用 $HOME/.exrc要小心,以免互相影响了设定。好处是可以把共同的设定设在 $HOME/.exrc 里。提醒您一下!设在设定檔中时 set前当然是不必冒号的。
9.1.3 nvi-m17n 的设定檔
~/.exrc
~/.nexrc

9.2 如何得知目前的设定
:set 或 :se   会显示所有经过修改的部份,就是和默认值不一样的部份。
:set all      显示目前所有设定值内容。
:scriptnames   显示各种设定文件的所在路径及其文件名。
:set option?   显示 option 这设定的目前值。
:option       直接在线设定,有些设定需加 =后加上设定值内容。
:set nooption  取消该设定。:set 后面是可以多重设定的。例如
:set autoindent noconfirm autowrite,这样三种设定就会同时重设。
您当然可以改设定檔来改变设定值。在 Vim 也可以使用 :opt[ion] 来直接在线设定,会列出目前的设定,在 set这个字上按 Enter 即可改变设定,或就直接修改其值亦可,改完后按 :q 就可以了。在简短说明处按Enter则会叫出该部份的说明檔给您参考,您说方不方便?改好后
:mk[exrc]    则会写入 ~/.exrc檔
:mkv[imrc]   则会写入 ~/.vimrc 檔
当然您得先搞清楚您目前所在目录在什么地方,如果您是在家目录启动的那就不用担心了,否则找不到您的新.vimrc可不要写信来骂我。:-) elvis 可就没这么方便了,得自行修改 $HOME/.exrc或$HOME/.elvislib/elvis.rc。

9.3 各种 set 功能说明
方括号内的是缩写,由于 Vim新增的指令、设定项实在是相当多,建议一开始使用完整的写法,等熟悉后再来使用缩写会比较好。
9.3.0.1 autoindent[ai] 
自动缩排,也就是说如果本行是从第五个字符开始写的,您按 Enter后游标就会停在次行第五个字符处。预设是不打开的。
9.3.0.2 autowrite[aw] 
档案一有更动就会自动存盘。预设不打开。
9.3.0.3 background[bg] (Vim 才有) 
可设成 dark 或 light,这是两种不同的 highlight 颜色设定,系统预设的内容是在一个synload.vim 檔中,详见$VIMRUNTIME/syntax/synload.vim。不过您要更动颜色的设定,最好是设在$HOME/.vimrc 或$HOME/.gvimrc 中,原始檔预设檔尽量不要去动她。
ㄟㄟㄟ,你从没提过 $VIMRUNTIME 好不好!其实这是最近版本的 Vim 为了不至安装新版本时把旧版本的一些设定或macro 檔干掉,所以 $VIMRUNTIME 就是 $VIM/vimxx,xx 就是版本号码啦!例如您使用的是 Vim 6.1版,那么就是 $VIM/vim61,往后安装 6.2 版时,会把 runtime files 装在$VIM/vim62,这样就不会把旧的 runtime files 给盖掉。
9.3.0.4 backup[bk] 
是否要 backup file。预设不打开。
9.3.0.5 writebackup[wb] (Vim 才有) 
在写入档案前先备份一份,和 backup 的作用不尽相同,请 :h backup-table。预设是打开的,所以您如果不要backup,那要关掉的是这个项目,而不是 backup。但请先检查一下您编译时是不是有编译进去,请 :ver。
9.3.0.6 backupdir[bdir] (Vim 才有) 
设定存放 backup file 的目录。预设在所编辑的档案之所在目录。
9.3.0.7 binary[bin] (Vim 才有) 
设在编辑二进制文件状态,这是防止存二进制文件时把 EOL也写进二进制文件,那就会悔不当初,如果是图檔将会无法再观看,如果是可执行档就无法执行了!因此预设是 off。elvis会自动判断是否为二进制文件,而且会分成左右两半,左半部会以 16 进位的方式显示,右半部则是以 ASCII 的方式来显示。
9.3.0.8 browsedir[bsdir] (Vim 才有) 
浏览档案的目录,GUI 版本始有。预设是上一次浏览的目录。就是 GUI 版本菜单上的 [File] 234 [Open]会打开的目录。
9.3.0.9 cindent[cin] (Vim 才有) 
写 C 时很好用,indent 比一般敏感,专为 C 程序代码而设。预设 off。编辑 C/C++ code时会自动打开。
9.3.0.10 cmdheight[ch] (Vim 才有) 
状态列的行数,预设一行,建议设成两行。
9.3.0.11 compatible[cp] (Vim 才有) 
设为和原始 vi 兼容的状态,vim 的扩充功能会被抑制。预设 off。
9.3.0.12 confirm[cf] (Vim 才有) 
各种确认动作。预设 off。
9.3.0.13 directory[dir] 
swap 文件存放的目录。前面单元已有说明。
9.3.0.14 fileformat[ff] (Vim 才有) 
这是写入档案时置放 EOL(end of line) 的形式
dos 是以 0x0D0A 来断行。
unix 是以 0x0A 来断行。
mac 是以 0x0D 来断行。
预设以各系统平台而定,在 Linux 当然是 unix 形式。
9.3.0.15 fileformats[ffs] (Vim 才有) 
可指定多个,会依加载的档案形式来调整 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 的意思。但这是 Vim 的扩充功能,elvis没有。elvis 纵使加载 dos 格式的档案,也是会自动把 ^M 隐藏起来。
9.3.0.16 ignorecase[ic] 
寻找时不分大小写,这对中文会造成困扰。预设 off。
9.3.0.17 incsearch[is] (Vim 才有) 
加强式寻找功能,在键入 patern 时会立即反应移动至目前键入之 patern 上。预设 off。
9.3.0.18 hlsearch[hls] (Vim 才有) 
寻找时,符合字符串会反白表示。预设 off。如果您是使用 vim 的预设的vimrc 檔的话,可设在 F8键来切换。
9.3.0.19 textwidth[tw] 
是一种 word wrap的功能,从左起算之固定每行的最大字符宽度。超过此宽度就会自动折行,这可是真的折行,也就是说在折行处会插入 EOL。预设是0,也就是没有 word wrap 的功能。
9.3.0.20 wrapmargin[wm] 
和 textwidth 作用相同,只是是从右窗口边向左算起要几个字符起折行。预设是 0。
9.3.0.21 wrap 
这也是折行功能,可是只是屏幕效果的折行,实际上并没有插入 EOL。
9.3.0.22 wrapscan[ws] 
这和折行没有关系,是指寻找时,找至檔尾时,是否要从檔首继续找。预设是要。
9.3.0.23 paste (Vim 才有) 
这是防止在做剪贴时位置会不正确,前面单元已有说明。
9.3.0.24 ruler[ru] (Vim 才有) 
会在状态列显示游标所在处之行列状态,预设不打开,但建议打开。最右边之代号的意义如下:
Top  档案第一行在屏幕可见范围。
Bot  档案最后一行在屏幕可见范围。
All  档案首尾皆在一个屏幕范围内。
如非以上三种情形,则会显示相对百分比位置。
9.3.0.25 statusline[stl] (Vim 才有) 
状态列显示的格式,使用预设就可以了,如果您想骚包一下的话,那就请您 :h stl。
9.3.0.26 shiftwidth[sw] 
指由 »移动整行内容时,一次移动的字符宽度,一般是使用 Tab 的值,但可由这个设定来改变。
9.3.0.27 tabstop[ts] 
一个 Tab 键宽度。预设是 8个字符宽度。最好不要随便改,以免您写的东西由其它编辑器来阅读时造成困扰,为解决这个问题,Vim 另有种 softtabstop 及modeline 的机制,在以下各节会详细说明。
9.3.0.28 showcmd[sc] 
在状态列显示目前所执行的指令,未完成的指令片段亦会显示出来。
9.3.0.29 showmode[smd] 
在状态列显示目前的模式,例如是 Insert mode 或是 Visual mode。当然平常的 normalmode(commond mode)是不显示的。在载入档案的同时,会在这个地方显示文件名称及其总行数、总字符数。
9.3.0.30 viusalbell[vb] (Vim 才有) 
以屏幕闪动代替 beep 声。
9.3.0.31 number[nu] 
显示行号。注意,冒号命令也有 :nu 这是显示光标所在行的行号,您嫌多打一个字的话,:# 也行。不过如果 ruler打开的话,在状态列本就会显示门前游标所在处的行列值。
9.3.0.32 list 
这也可以算是一种模式,list mode。就是 Tab 的地方会以 ^I 显示,而行尾之 EOL 会显示成$。可以让您清楚的知道 Tab 在哪里,折行是不是真的。
9.3.0.33 swapfile[swf] (Vim 才有) 
是否需 swap 至磁盘。如果设为 noswf 的话,那将不会有 swapfile 产生,通通会加载在内存中。预设是要swapfile。
9.3.0.34 fileencoding[fe] (Vim 才有) 
首先,先鼓掌一下,啪啪啪……,因为有支持 Taiwan,也支持 XIM,也就是说可以使用 xcin-2.5x来作输入,当然您用 xcin-2.3x 配合 XA 也是可以啦!但前提是您要把 multi_byte编译进去,这在一开始就讲过了。预设是使用 ansi。set guifont 及 set guifontset已在一开始讲过,在此就不重复了。
9.3.0.35 history[hi] 
记录冒号命令的历史纪录文件,就是可以用上下方向键叫出来的那锅。预设是 20 笔。

9.4 关于 softtabstop[sts]
几乎所有的 OS 及软件都设定 Tab 就是 8个字符长,这已经是个公认值,您硬要去改变它的话恐怕带来许多不便,但实际上关于程序风格,许多人又认为 8个字符太长了,几个巢状循环下来就需折行,反而不方便。因此 Vim 体贴您,内建了 softtabstop 的功能,就是由 Vim来代您制造出一个假的 Tab,实际上是空格符组成的 Tab。
举个例子来说明比较清楚。
set softtabstop=4
set shiftwidth=4
这样会由 4 个空格符取代一个 Tab,您按 Tab 键 vim 就跳 4 格,需注意的是,如果您按了三次Tab键,那就是一个实际的 Tab 加上四个空格符,可不是 12 个空格符喔!是混合 Tab 及 Space 的。
问题来了!那我要按真正的 8 字符的 Tab 时怎么办?简单,还记得怎么按特殊字符吗?Ctrl+v Tab 或Ctrl+vI 就可以了,那就是如假包换的 8 字符长之 Tab。当然,您按两次 Tab 不就得了!:-)
另一个更大的问题也来了!在 Un*x 系统的有些设定文件,例如 Makefile, snedmail的设定檔,他们会认真正的 Tab,因此如果您有程序开发或系统管理的需要的话,最好是不要随意更动 Tab 值,也不要使用softtabstop,可以使用 Vim 独特的 modeline 来控制,请继续研读下一节。

9.5 Vim 的 modeline
这个是什么哇?简单的说,Vim 有能力去解读所编辑档案内的 Vim 控制参数,而这些控制参数是写在档案的批注行里头的,例如sh script 的批注行是以 # 来开头的,那 Vim 的控制参数就可以写在这些批注里头,Vim在开这个档的同时,也会去控制自己的一些行为,当然,包括了上一节所说的 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 皆可)隔开。例如:
    => C 程序代码 /* 和 vim 间至少要有个空白
   // vim:ts=2            => C++
   # vim:ts=2             => sh script,perl, python, tcl
   " vim:ts=2             => vimscript

9.6 关于折行
前面已说过 set wrap就可以造成屏幕折行,可是却会把一个英文单字折成两半,实在很不雅观。好了,Vim再体贴您一次,:set linebreak(lbr)就会避免这种问题发生,会在空白或标点符号的地方来折行,但也仍属屏幕折行,并不会插入 EOL。
在一般的文书排版处理,甚至是写程序代码,设定系统的设定文件,这些时机,可能自动折行并不很适合(指会插入 EOL的),很容易把写好的内容,因为一个不小心就都弄乱了,因为程序一般是一行一行在读的,把一整行分成两半,所读的结果就不一样了,除非加入程序代码的折行标志,例如一般的倒斜线9.1\或 TeX/LaTeX 的百分号 %。而在排版软件如 TeX/LaTeX,插入 EOL 的折行,会造成中文字间多出个空白,这在HTML 格式的档案亦同,因此,在做折行的决定时,也请考虑一下其它的『副作用』。

9.7 我的设定檔
以下是我个人的设定檔,仅供参考用:
9.7.1 .vimrc 范例
" ~/.vimrc by Edward G.J. Lee
" 这个记号就是 vim 的批注,通常情形 vim 会忽略。
" This code is Public Domain
"
set backspace=indent,eol,start

set autoindent     " alwaysset autoindenting on
set history=50     " keep 50lines of command line history
set ruler         " show thecursor position all the time
set showcmd       " display incompletecommands

set enc=big5      " 档案编码设成 big5

"使用 :update 代替 :w,以便在有修改时才会存盘,注意,这和 vi 不兼容。
map <F2>:up<CR>
map <F3>:up<CR>:q<CR>   " 存档后离开
map <F4>:q!<CR>   " 不存档离开
map <F5>:bp<CR>   " 前一个 buffer 档案
map <F6>:bn<CR>   " 下一个 buffer 档案
" 单键 <F7> 控制 syntax on/off。倒斜线是Vim script 的折行标志
" 按一次 <F7> 是 on 的话,再按一次则是off,再按一次又是 on。
" 原因是有时候颜色太多会妨碍阅读。
map <F7> :if exists("syntax_on")<BAR>
     \  syntax off<BAR><CR>
     \ else<BAR>
     \  syntax enable<BAR>
     \endif <CR>
" 按 F8 会在 searching highlight 及非 highlight 间切换
map <F8> :sethls!<BAR>sethls?<CR>
" Toggle on/off paste mode
map <F9> :setpaste!<BAr>setpaste?<CR>
set pastetoggle=<F9>

map <F10><ESC>:read!date<CR>   " 插入日期
map <F11>:%!xxd<CR>      " 呼叫 xxd 做 16 进位显示
map <F12> :%!xxd-r<CR>   " 回复正常显示

"Default backspace like normal
set bs=2

"Display a status-bar.
"set laststatus=2

"Show matching parenthese.
set showmatch

" 以下是颜色设定,详细请 :h hi
hi Comment     term=bold ctermfg=darkcyan
hi Constant    term=underline ctermfg=Red
hi Special     term=bold ctermfg=Magenta
hi Identifier   term=underlinectermfg=cyan
hi Statement    term=boldctermfg=Brown
hi PreProc     term=bold ctermfg=DarkYellow
hi Type        term=boldctermfg=DarkGreen
hi Ignore      ctermfg=white
hi Error       term=reverse ctermbg=Redctermfg=White
hi Todo        term=standout ctermbg=Yellowctermfg=Red
hi Search      term=standout ctermbg=Yellow ctermfg=Black
hi ErrorMsg     term=reversectermbg=Red ctermfg=White
hi StatusLine   ctermfg=darkblue ctermbg=gray
hi StatusLineNC ctermfg=brown  ctermbg=darkblue

set viminfo='20,\"50    "read/write a .viminfo file, don't store more
                     " than 50lines of registers

" 方便中文重排设定
set formatoptions=mtcql

" 设定 modeline
" vim: ts=2:
9.7.2 .gvimrc 范例
" ~/.gvimrc by Edward G.J. Lee
" This code is Public Domain
"
set mousehide          " 当输入文字时隐藏mouse
map <S-Insert><MiddleMouse>
map! <S-Insert><MiddleMouse>

" Only do this for Vim version 5.0 and later.
if version >= 500
  let c_comment_strings=1
  if !exists("syntax_on")
    syntax on
  endif

  hi Comment     guifg=DarkBlue
  hi Constant    gui=bold guifg=Magenta guibg=#fffff5f2eed8
  hi Special     guifg=Blueguibg=#fffff5f2eed8
  hi Identifier   gui=boldguifg=DarkCyan
  hi Statement   gui=bold guifg=brown
  hi PreProc     gui=bold guifg=black
  hi Type       guifg=darkgreen
  hi Ignore      guifg=bg
  hi Error       guibg=Redgui=bold guifg=White
  hi Todo        guifg=Blueguibg=Yellow
  hi ErrorMsg    guibg=Red gui=bold guifg=White
  hi Normal      guibg=#fffff5f2eed8
  hi ModeMsg     guifg=DarkBlueguibg=yellow
  hi StatusLine   gui=boldguifg=lightgray guibg=DarkBlue
  hi StatusLineNC gui=bold guifg=lightgrayguibg=brown
  hi Cursor guibg=green guifg=NONE
  hi lCursor guibg=Cyan guifg=NONE

endif

" 让 ex(:) mode 时可以输入中文(gvim)
set imcmdline
" 让 xcin 在 insert mode 不自动出现(gvim)
set imdisable
9.7.3 .vim 目录范例
其实,一些设定文件除了家目录下的 .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, 6files
其中,filetype.vim 会在系统的 filetype.vim加载后盖过去,也就是家目录的会先优使用。format.vim 及tex.vim 是进入 vim 马上会加载的 Vimscript,主要用于中文重排及 TeX/LaTeX 排版系统编辑时的方便指令、按键。lily.vim 则是 GNU LilyPond这个乐谱排版系统档案的语法颜色定义文件,svg.vim 则是 SVG 向量图文件的语法颜色定文件加强版。那 view那个子目录下的又是什么呢?这是下 :mkview 指令时所存的一些状态檔,在
:loadview 要参考到,请参考第 11 章,第11.1.3 小节,页  ,这个檔是个隐藏檔。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐