使用Ӟ用:set fdm=marker 命o来设|成marker折叠方式Qfdm是foldmethod的羃写)?br /> 要每次打开vim时折叠都生效Q则?vimrc文g中添加设|,如添加:set fdm=syntaxQ就像添加其它的初始化设|一栗?/p>
2. 折叠命o
选取了折叠方式后Q我们就可以Ҏ(gu)些代码实施我们需要的折叠了,׃我用indent和markerE微多一些,故以它们的用ؓ例:
如果使用了indent方式Qvim会自动的对大括号的中间部分进行折叠,我们可以直接使用q些现成的折叠成果?br />
在可折叠处(大括号中_Q?br />
zc 折叠
zC Ҏ(gu)在范围内所有嵌套的折叠点进行折?
zo 展开折叠
zO Ҏ(gu)在范围内所有嵌套的折叠点展开
[z 到当前打开的折叠的开始处?br />
]z 到当前打开的折叠的末尾处?br />
zj 向下Ud。到达下一个折叠的开始处。关闭的折叠也被计入?br />
zk 向上Ud到前一折叠的结束处。关闭的折叠也被计入?/font>
当用marker方式Ӟ需要用标计来标识代码的折叠Q系l默认是{{{和}}}Q最好不要改动之Q)
我们可以使用下面的命令来创徏和删除折叠:
zf 创徏折叠Q比如在marker方式下:
zf56GQ创Z当前行v?6行的代码折叠Q?br />
10zf?0zf+或zf10↓Q创Z当前行v到后10行的代码折叠?br />
10zf-或zf10↑Q创Z当前行vC?0行的代码折叠?br />
在括号处zf%Q创Z当前行v到对应的匚w的括号上去(Q)Q{}Q[]Q?lt;>{)?br />
zd 删除 (delete) 在光标下的折叠。仅?'foldmethod' 设ؓ "manual" ?"marker" 时有效?br />
zD 循环删除 (Delete) 光标下的折叠Q即嵌套删除折叠?br />
仅当 'foldmethod' 设ؓ "manual" ?"marker" 时有效?br />
zE 除去 (Eliminate) H口?#8220;所?#8221;的折叠?br />
仅当 'foldmethod' 设ؓ "manual" ?"marker" 时有效?/font>
本节所用命令的帮助入口Q?
:help filetype
:help setfiletype
:help modeline
:help 'modelines'
:help 'shiftwidth'
:help 'expandtab'
:help autocmd
打开文gcd功能很单,在你的vimrc中加入下面一句话可以了Q?/span>
filetype plugin indent on
如果你用的是VIM自带的示例vimrcQ那么你已经打开了文件类型检功能。或者,你也可以输入“:filetype”命o查看你的文gcd功能有没有打开?/span>
q条命oI竟做了什么呢Q我们在下面详细介绍?/span>
其实Q上面这一条命令,可以分ؓ三条命oQ?/span>
filetype on
filetype plugin on
filetype indent on
我们逐条介绍q三条命令?/span>
“filetype on”命o打开文gcd功能,它相当于文gcd功能的开兟뀂在执行“filetype on”命oӞVIM实际上执行的?VIMRUNTIME/filetype.vim脚本。这个脚本用了自动命o(autocmd)来根据文件名来判断文件的cdQ如果无法根据文件名来判断出文gcdQ它又会调用$VIMRUNTIME/scripts.vim来根据文件的内容讄文gcd。有兴趣可以M下这两个脚本Q以获得更深的认识?/span>
在上q步骤完成后Q绝大多数已知类型的文gQ都能被正确出文gcd。如果文件的cd未能被正的出来,需要手工设|文件类型,q可以通过“set filetype”完成Q例如,如果你把main.c改名为main.c.bak1Q那么它?yu)无法被正确出文gcd。通过下面的Ex命oQ就可以把它的文件类型设为cQ?/span>
:set filetype=c或者,你可以在文g中加入一个模式行Q来指明q个文g的类型。VIM在打开文gӞ会在文g首、尾的若q行Q行数由'modelines'选项军_Q缺省ؓ5行)具有VIMҎ(gu)标记的行Q称为模式行。如果检到Q就使用模式行中定义的选项|来修改该~冲区的选项。你可以留意一下VIM的帮助页Q每个文件的最后一行都是这L模式行?/span>
针对上例Q我们可以在main.c.bak1的第一行或最后一行加上下面的内容Q要指定q个文g的类型:
/* vim: ft=c */q句话?#8220;/* */”注释h了,因此不会影响~译?#8220;ft”?#8220;filetype”的羃写,VIM中很多命令、选项都有~写形式Q以方便使用。注?#8220;/*”?#8220;vim:”间的I格。在“*/”?#8220;ft=c”_也需要有臛_一个空|q是模式行格式的要求Q更多信息参?#8220;:help modeline”?/span>
出文g的类型有什么作用呢Q我们知道,不同cd的文件具有不同的格式QVIM通过Ҏ(gu)件类型的识别Q可以ؓ不同cd的文Ӟ讄不同的选项倹{定义不同键l定{。例如,对于ccd的文Ӟ它就和bash脚本有不同的注释格式、不同的~进格式、不同的关键字等。VIM在设|文件类型后Q会触发FileType事gQ执行FileType相关的自动命令,对不同类型的文g区别对待?/span>
上面提到?#8220;filetype plugin on”Q允许VIM加蝲文gcd插g。当q个选项打开ӞVIM会根据检到的文件类型,在runtimepath中搜索该cd的所有插Ӟq执行它们?/span>
“filetype plugin on”命oQ实际上是执?VIMRUNTIME/ftplugin.vim脚本Q有兴趣可以M下这个脚本。这个脚本中会设|自动命令,在runtimepath中搜索文件类型插件?/span>
runtimepath的定义在不同的系l上不一P对UNIXpȝ来说Q这些\径包括:$HOME/.vim?VIM/vimfiles?VIMRUNTIME?VIM/vimfiles/after?HOME/.vim/after?/span>
举一个例子,当我们对一个ccd的文件打开“filetype plugin on”Ӟ它会在上q这几个目录的ftplugin子目录中搜烦所有名为c.vim、c_*.vimQ和c/*.vim的脚本,q执行它们。在搜烦Ӟ它按目录在runtimepath中出现的序q行搜烦。缺省的Q它会执?VIMRUNTIME/ftplugin/c.vimQ在q个脚本里,会设|c语言的注释格式、智能补全函数等{?/span>
“filetype indent on”允许VIMZ同类型的文g定义不同的羃q格式。这条命令也是通过一个脚本来完成加蝲Q?VIMRUNTIME/indent.vim。和“filetype plugin on”cMQ它也通过讄自动命oQ在runtimepath的indent子目录中搜烦~进讄。对ccd的文件来_它只是打开了cindent选项?/span>
我们了解了文件类型检的用途及它是如何工作的之后,可以根据自q需要,来对特定的文件类型进行特D设|?/span>
例如Q我们在上篇文章中介l过lookupfile插gQ在它打开一个缓冲区Ӟ会把~冲区的filetype讄为lookupfileQ我们可以利用这一点,在这个缓冲区里进行一些特D的配置。例如,我们创徏一个名为lookupfile.vim的文Ӟ其内容ؓQ?/span>
" close lookupfile window by two <Esc>
nnoremap <buffer> <Esc><Esc> <C-W>q
inoremap <buffer> <Esc><Esc> <Esc><C-W>q它定义了两个局部于~冲区的键绑定,无论在normal模式q是插入模式Q只要连按两ơESCQ就关闭当前~冲区?/span>
把这个文件保存到你的runtimepath所指向M目录的ftplugin子目录中Q一般是攑֜~/.vim/ftplugin目录中)。你在下ơ打开lookupfileH口Ӟ试试q按两次ESCQ是不是lookupfileH口关闭了Q这栯|,非常适合VIM中按ESC取消命o的习惯,效率也高?/span>
如果你对VIM~省文gcd插g的设|不太满意,那么可以把这个全局插g拯?HOME/.vim/plugin目录中,然后更改其中的设|。你可以留意一下VIM~省的文件类型插Ӟ它们的头部都有这L代码Q?/span>
" Only do this when not done yet for this buffer
if exists("b:did_ftplugin")
finish
endifq类gC语言头文件中?#8220;#ifndef XXX | #define XXX”的语句,可以防止该插件被执行多次。因此,把这个插件拷贝到$HOME/.vim/plugin中(q个目录在runtimepath中排在最前面Q,它将先于VIM的缺省插件被加蝲Q而它加蝲后,VIM的缺省文件类型插件就不会再被加蝲了。这pC我们修改讄的目的?/span>
不过我们通常不用q种Ҏ(gu)。如果这样做Q一旦VIM的缺省插件做了改变,我们也要更新我们改过的插件才行。我们可以在载入全局插g以后否决一些设|。在Unix 上,我们可以把我们的讄攑֜~/.vim/after/ftplugin/目录中,q个目录中的脚本会在VIM的缺省脚本后执行。这样就可以修改配置Q或增加我们自己的定义?/span>
举个例子Q在多h一起开发项目时Qؓ了代码风格量保持一_一般不允许在代码用TABW,而以4个空g之。我们可以编辑一个文Ӟ包含下面的内容:
set shiftwidth=4
set expandtab把这个文件保存ؓ~/.vim/after/ftplugin/c.vim。这P每次在编辑c文gӞ它的自动~进?个空|当你在插入模式下使用CTRL-D、CTRL-T~进Ӟ它也会调?个空格的~进Q当你按TAB键时Q它?yu)会插?个空?#8230;…如果你想上面的设|对h文g也生效的话,需要把它另存一份:~/.vim/after/ftplugin/cpp.vimQ因为h文g的文件类型被设ؓcpp?/span>
我们知道QVIM在设|文件类型时Q会触发FileType自动命oQ因此,上面的例子可以用下面的自动命令来实现Q?/span>
autocmd FileType c,cpp set shiftwidth=4 | set expandtab把这个命令放在你的vimrc中,可以起到和上例同L效果?/span>
来自Q?/span>http://blog.csdn.net/easwy/archive/2007/03/20/1534580.aspx
:help lookupfile
前面我们讲过通过”:find”命o打开指定的文Ӟ不过使用”:find”命oq不是非常的方便Q一是如果项目比较大、文件比较多Qfind查找h很慢Q二是必输入全部的文g名,不能使用正规表达式查找?/p>
我们也介l过VIM提供的文件浏览插Ӟ你可以在览器中Ҏ(gu)目录L找,但这U方式在览目录时比较方便,查找一个已知名字(或知道部分名字)的文件效率就比较低了?/p>
相比之下Q在source insight中查找文仉常简单,只要输入部分的文件名Q就可以扑ֈW合条g的文件?/p>
我一直被q个问题所困扰Q直到有一天,?a >www.vim.org上发C一个非常出色的插gQ才d解决了查找文件效率低下的问题Q它的功能毫不逊于source insight。在l该插g投票Ӟ我选择?#8220;Life Changing”。是的,它改变了我的生活Q?/p>
q个插g的名字是QlookupfileQ?/p>
Lookupfile插g可以在下面的链接下蝲Q?/p>
http://www.vim.org/scripts/script.php?script_id=1581
它用VIM 7.0提供的插入模式下的下拉菜单补全功能,因此只能在VIM 7.0及以上版本中使用?/p>
下蝲该插件后Q把它解压到你的~/.vim目录中,完成了安装。然后在VIM中执?#8221;:helptags ~/.vim/doc”命oQ生成help文g索引Q然后就可以使用”:help lookupfile”命o查看lookupfile插g的帮助文件了?/p>
注:windows用户需要把q个插g解压在你?VIM/vimfiles?HOME/vimfiles目录?/p>
Lookupfile插gq需要最新的genutils支持Q因此,需要下载genutilsQ?/p>
http://www.vim.org/scripts/script.php?script_id=197
q个插g提供了一些通用的函敎ͼ可供其它的脚本用。它的安装方法也是在~/.vim目录解压可以了。需要注意的是,最新版本的genutils使用了新的自动加载方式,所以和以前的版本不兼容。如果你的其它插仉要用genutils的旧版本的话Q你需要参照genutils的说明进行配|,以便使新旧两个版本能协同工作?/p>
现在我们介绍lookupfile插g。虽然名字ؓlookupfileQ其实这个插件它不仅能用来查找文Ӟq可以在打开的缓冲区中查找,按目录查找,{等?/p>
[目文g查找]
Lookupfile在查找文件时Q需要用tag文g。它可以使用前面文章中提到的使用“ctags”命o生成的tag文gQ不q查找效率会比较低。因此我们会专门为它生成一个包含项目中所有文件名的tag文g?/p>
我编写了下面的shell脚本Qؓvim70的源代码Q生成一个文件名tag文g?/p>
#!/bin/sh
# generate tag file for lookupfile plugin
echo -e "!_TAG_FILE_SORTED\t2\t/2=foldcase/" > filenametags
find . -not -regex '.*\.\(png\|gif\)' -type f -printf "%f\t%p\t1\n" | \
sort -f >> filenametags
回想一下我们在“使用tag文g和taglist插g (一)”一文中介绍的tag文g的格式。再对照脚本命o来看Q?/p>
- echo命o用来生成filenametags文g中的“!_TAG_FILE_SORTED”行,表明此tag文g是经q排序的?/p>
- find命o用来查找所有类型ؓ普通文Ӟ文g后缀名不?png?gif的文Ӟ扑ֈ的文件按“文g名\t文g路径\t1”的格式输出出来?/p>
- sort命o则把find命o的输出重新排序,然后写入filenametags文g?/p>
在~/src/vim70/目录下运行该脚本Q会生成一个名为filenametags的文Ӟ包含了vim70目录下的所有文件的名字及其所在目录?/p>
现在我们需要让lookupfile插g知道到哪L文g名tag文g。我们假定VIM当前工作目录为~/src/vim70/Q执行下面的命oQ?/p>
:let g:LookupFile_TagExpr = '"./filenametags"'
注:如果不设定g:LookupFile_TagExpr的|那么lookupfile插g会以tags选项定义的文件作为它的tag文g?/p>
现在我们可以用lookupfile来打开文g了,?#8220;<F5>”或输?#8220;: LookupFile”在当前窗口上Ҏ(gu)开一个lookupfile窗口,开始输入文件名Q至?个字W)Q随着你的输入Q符合条件的文g列在下拉列表中了。文件名可以使用VIM的正则表辑ּQ这大大方便了文件的查找。你可以?#8220;CTRL-N”?#8220;CTRL-P”Q或者用上、下光标键)来在下拉列表中选择你所需的文件。选中文g后,按回车,可以前一个窗口中打开此文件?/p>
下图是用lookupfile插g查找文g的一个例子:
在屏q最上方的窗口就是lookupfileH口Q在q个H口中输?#8220;gui.*x11”几个字符Q查扑ֈ6个匹配文Ӟ使用CTRL-N选中gui_x11.c文gQ然后按回RQ就会在前一个窗口中打开src/gui_x11.c文gQlookupfileH口也自动关闭了。是不是非常方便Q?/p>
[~冲区查找]
在开发过E中Q我l常会同时打开数十甚至上百个文件。即使是使用BufExplorer插gQ想在这么多buffer中切换到自己所要的文gQ也不是件容易的事?/p>
Lookupfile插g提供了一个按~冲区名字查扄冲区的方式,只要输入~冲区的名字Q可以是正则表达式)Q它?yu)可以把匚w的缓冲区列在下拉列表中,同时q会列出该缓冲区内文件的路径Q当你的buffer中有多个同名文gӞq可以帮你迅速找C惌的文件?/p>
使用“:LUBufs”命o开始在~冲Z查找Q输入缓冲区的名字,在你输入的过E中Q符合条件的~冲区就昄在下拉列表中了,选中所需~冲区后Q按回RQ就会切换你所选的~冲区。下图是一个示例:
[览目录]
Lookupfile插gq提供了目录览的功能,使用“:LUWalk”打开lookupfileH口后,可以输入目录,lookupfile会在下拉列表中列个目录中的所有子目录及文件供选择Q如果选择了目录,׃昄q个目录下的子目录和文gQ如果选择了文Ӟ在VIM中打开q个文g?/p>
下图是用LUWalk的一个抓图:
Lookupfile插gq提供了LUPath和LUArgs两个功能Q这两个功能我用的不多,׃在这里介l了。感兴趣的朋友读一下lookupfile的帮助页?/p>
[Lookupfile配置]
Lookupfile插g提供了一些配|选项Q通过调整q些配置选项Q它更W合你的工作习惯。下面是我的vimrc中关于lookupfile的设|,供参考:
""""""""""""""""""""""""""""""
" lookupfile setting
""""""""""""""""""""""""""""""
let g:LookupFile_MinPatLength = 2 "最输?个字W才开始查?br />
let g:LookupFile_PreserveLastPattern = 0 "不保存上ơ查扄字符?br />
let g:LookupFile_PreservePatternHistory = 1 "保存查找历史
let g:LookupFile_AlwaysAcceptFirst = 1 "回R打开W一个匹配项?br />
let g:LookupFile_AllowNewFiles = 0 "不允许创Z存在的文?br />
if filereadable("./filenametags") "讄tag文g的名?br />
let g:LookupFile_TagExpr = '"./filenametags"'
endif
nmap <silent> <leader>lk <Plug>LookupFile<cr> "映射LookupFile?lk
nmap <silent> <leader>ll :LUBufs<cr> "映射LUBufs?ll
nmap <silent> <leader>lw :LUWalk<cr> "映射LUWalk?lw
有了上面的定义,当我输入”,lk”Ӟ׃在tag文g中查找指定的文g名;当输?#8221;,ll”Ӟ׃在当前已打开的buffer中查找指定名字的bufferQ当输入”,lw”Ӟ׃在指定目录结构中查找?/p>
另外Q我q在目相关的配|文件vim70sx.vimQ参考本pdW?文章)中加入了lookupfile所使用的tag文g的信息:
let g:LookupFile_TagExpr = '"filenametags"'
q样Q在恢复前次会话时就llookupfile插g定义了tag文g?/p>
在用lookupfile插g查找文gӞ是区分文件名的大写的,如果惌行忽略大写的匹配,可以使用VIM忽略大小写的正则表达式,卛_文g名的前面加上“\c”字符。D个例子,当你输入“\cab.c”Ӟ你可能会得到“ab.c”?#8220;Ab.c”?#8220;AB.c”……?/p>
注:如果惛_快lookupfile忽略大小写查扄速度Q在生成文g名tag文gӞ使用混合大小写排序。这在本pd的第5文章中有所提及?/p>
通常情况下我都进行忽略大写的查找,每次都输?#8220;\c”很麻烦。没关系Qlookupfile插g提供了扩展功能,把下面这D代码加入你的vimrc中,可以每ơ在查找文g旉忽略大小写查找了Q?/p>
" lookup file with ignore case
function! LookupFile_IgnoreCaseFunc(pattern)
let _tags = &tags
try
let &tags = eval(g:LookupFile_TagExpr)
let newpattern = '\c' . a:pattern
let tags = taglist(newpattern)
catch
echohl ErrorMsg | echo "Exception: " . v:exception | echohl NONE
return ""
finally
let &tags = _tags
endtry
" Show the matches for what is typed so far.
let files = map(tags, 'v:val["filename"]')
return files
endfunction
let g:LookupFile_LookupFunc = 'LookupFile_IgnoreCaseFunc'
有时在LUBufs时也需要忽略缓冲区名字的大写Q我是通过直接修改lookupfile插g的方法,在LUBufs查找的字W串前都加上“\c”Q之忽略大写。如果你不想q样Q可以每ơ在~冲区名字前手动加上“\c”?/p>
本文关于Lookupfile插g׃l这么多Q请阅读帮助获取更多的信息?/p>
q是一个非常好的插Ӟ希望能ؓ更多人喜爱!
也欢q大家多交流使用中的心得和疑问?/p>
来自Q?a >http://blog.csdn.net/easwy/archive/2007/03/12/1527228.aspx
本节所用命令的帮助入口Q?/span>
[文g览]
在开发过E中Q经帔R要查找某个文件。我们前面在介绍path选项Ӟ介绍q?/span>find命o查找文g的方法。本节介l?/span>VIM的文件浏览插件?/span>
?/span>VIM 7.0以前Q文件浏览功能由explorer.vim插g提供Q在VIM 7.0中,q个插g?/span>netrw.vim插g所代替。本文以VIM 7.0ZQ主要介l?/span>netrw.vim插g?/span>
netrw.vim?/span>VIM的标准插Ӟ它已l伴?/span>VIM发行Q不需要安装?/span>
我们现在试一?/span>VIM?/span>文g览功能Q当你?/span>VIM试打开目录ӞVIM会自动调?/span>netrw.vim插g打开该目录(从操作系l的视角来看Q目录其实是一U特D的文gQ。例如,我们?/span>VIM中执行命?#8220;:e ~/src/vim70/src/”Q会昄下面的窗口:
q个H口cM于文件管理器Q你可以创徏、删除、改名文件或目录Q在目录上按回RӞ会进入该目录Q在文g上按回RӞ会?/span>VIM打开该文Ӟ可以更改排序方式、排序风|隐藏目录或文Ӟ使之不在上述H口中显C){等?/span>
Netrw插g中常用键l定有:
其它常用键,诸如使用书签、隐藏符合条件的文g{,请参?/span>netrw帮助c?/span>
上面我们?#8220;:e ~/src/vim70/src/”的方式打开netrwQ我们还可以使用“:Explore”{?/span>Ex命o来打开文g览器。我?/span>vimrc中这样配|:
q样Q在我输?#8220;,fe”Ӟ׃打开一个垂直分隔的H口览当前文g所在的目录Q窗口的宽度?/span>30?/span>
览本地文g只是netrw插g的一小功能Q?/span>netrw插g最主要的功能是支持q程文gd。利用该插gQ你可以通过ftpQ?/span>sshQ?/span>http{多U协议来~辑q程文gQ也可以览q程机器的目录?/span>
在Y件开发过E中不常使用此功能,本文中不再介l。参?/span>netrw帮助获取更多信息?/span>
[~冲区浏?/span>]
在开发过E中Q经怼打开很多~冲区,其是?/span>tag文g在不同函数间跌{Ӟ会不知不觉打开很多文g。要知道自己当前打开了哪些缓冲区Q可以?/span>VIM?#8220;:ls”Ex命o查看?/span>
开发过E中Q又l常需要在不同文g间蟩转。我习惯于?#8220;CTRL-^”来切换文Ӟq就需要知道文件所在的~冲区编受每ơ都使用“:ls”来找~冲区编号很ȝQ所以我使用BufExplorer插g来显C缓冲区的信息?/span>
BufExplorer插g在此处下载:
http://vim.sourceforge.net/scripts/script.php?script_id=42
下蝲后,把该文g?/span>~/.vim/目录中解压羃Q这会在你的~/.vim/plugin?/span>~/.vim/doc目录中各攑օ一个文Ӟ
plugin/ bufexplorer.vim - bufexplorer插g
doc/ bufexplorer.txt - bufexplorer帮助文g
?/span>Q?/span>windows用户需要把q个插g解压在你?/span>$VIM/vimfiles?/span>$HOME/vimfiles目录?/span>
使用下面的命令生成帮助标{(下面的操作在VIM中进行)Q?/span>
然后Q就可以使用“:help bufexplorer”命o查看BufExplorer的帮助文件了?/span>
BufExplorer功能比较单,q里׃做介l了。我?/span>vimrc里这栯|?/span>BufExplorer插gQ?/span>
BufExplorer已经映射了几个键l定Q例如,使用“,bv”可以打开一个垂直分割窗口显C当前的~冲区?/span>
有一个称?/span>minibufexpl.vim的插Ӟ也可以把~冲区列表显C出来,q个插g在此处下载:
http://vim.sourceforge.net/scripts/script.php?script_id=159
使用q个插g后,屏幕截图看v来是q样Q最上面一个窗口就?/span>minibufferH口Q列Z当前打开的缓冲区Q?/span>
q个插g没有帮助文gQ参考下载页上的说明Q以及脚本代码中的注释来配置?/span>
[winmanager插g]
winmanager插g可以把前面介l的Explorer插g(VIM 7.0以前的文件浏览插?/span>)?/span>BufExplorer插g集成在一P我们上篇文章中介l过?/span>taglist插g也提供了?/span>winmanager插g的支持?/span>
Winmanager插g在这里下载:
http://vim.sourceforge.net/scripts/script.php?script_id=95
下蝲后,把该文g?/span>~/.vim/目录中解压羃Q这会把winmanager插g解压?/span>~/.vim/plugin?/span>~/.vim/doc目录中:
plugin/winmanager.vim – winmanager插g
plugin/winfileexplorer.vim - 改良?/span>Explorer插g
plugin/wintagexplorer.vim – winmanager提供?/span>tag插gQ用处不?/span>
doc/winmanager.txt – 帮助文g
仍然?#8220;:helptags ~/.vim/doc”命o来生成帮助标{,然后可以?#8220;:help winmanager”来查看帮助了?/span>
使用winmanager插g可以控制各插件在VIMH口中的布局昄。我?/span>vimrc中这栯|:
g:winManagerWindowLayout变量的值定?/span>winmanager的窗口布局Q用上面的讄Q我们的H口布局看v来是q样的:
左边有两个窗口,上面的是BufExplorerH口Q下面是taglistH口?/span>FileExplorerH口?/span>BufExplorerq一个窗口,?/span>BufExplorerH口中?#8220;CTRL-N”可以切换?/span>FileExplorerH口Q再使用一ơ则又切换回BufExplorerH口。也是_在变?/span>g:winManagerWindowLayout中,使用“,”分隔的插Ӟ在同一个窗口中昄Q?#8220;CTRL-N”在不同插仉切换Q?#8220;|”分隔的插Ӟ则在另外一个窗口中昄?/span>
在屏q右边的H口则是ȝ辑区?/span>
在上面的vimrc中,q定义了三个键绑定,分别用于跛_左上H口、左下窗口,以及昄/关闭winmanagerH口?/span>
?/span>Q安装后Q如果未讄g:winManagerWindowLayout变量Q?/span>winmanager插g需要与BufExplorer插g一h能用。所以需要下?/span>BufExplorer?/span>
?/span>http://vim.sourceforge.net/scripts/script.php?script_id=1440有一?/span>winmanager插g的修改版本,如果?/span>FileExplorer中打开文gӞ它会使用与该文g相关联的E序来打开该文Ӟ而不是?/span>VIM。我没有使用q这个插Ӟ有兴你可以试试?/span>
来自Q?/a>http://blog.csdn.net/easwy/archive/2007/03/09/1525554.aspx
本节所用命令的帮助入口Q?/p>
:help ‘tags’
:help :tag
:help :tags
:help CTRL-]
:help CTRL-T
:help vimgrep
:help cw
:help pattern
管相关的文章已l很多了Q但tag文g实在是太有用了,所以还是啰嗦一ơ?/p>
Tag文g(标签文g)无疑是开发h员的利器之一Q有了tag文g的协助,你可以在VIM查看函数调用关系Q类、结构、宏{的定义Q可以在L标签中蟩转、返?#8230;…怿使用qSource Insight的h对这些功能ƈ不陌生,而在VIM中,此功能的实现依赖于tag文g?/p>
对于E序来说QTag文g中保存了诸如函数、类、结构、宏{的名字Q它们所处的文gQ以及如何通过Ex命o跌{到这些标{。它是一个纯文本文gQ因此你可以手工的编辑它Q也可以使用脚本对其q行操作?/p>
通常我们使用名ؓctags的程序来生成q样的tag文g。VIM能直接用ctagsE序所生成的tag文g。在UNIXpȝ下的ctags功能比较?yu),所以一般我们用Exuberant CtagsQ在大多数Linuxpȝ上,它是~省的ctagsE序Q,它能够支持多?3U程序语aQ以满x们开发的需要了。如果你的系l上未安装此E序Q请?a >http://ctags.sourceforge.net下蝲?/p>
EMACS则用etags来生成tag文gQ如果希望VIM也能支持etags的tag文g格式Q需要在~译VIM时加?#8221; +emacs_tags”选项?/p>
Tag文g需要遵循一定的格式Q由Exuberant Ctags生成的tag文gQ缺省是如下格式Q?/p>
{tagname} {TAB} {tagfile} {TAB} {tagaddress} {term} {field} ..
{tagname} 标识W名字,例如函数名、类名、结构名、宏{。不能包含制表符?/p>
{tagfile} 包含 {tagname} 的文件。它不能包含制表W?/p>
{tagaddress} 可以定位?{tagname}光标位置?Ex 命o?/p>
{term} 设ؓ“;"”。这是ؓ了兼容Vi~辑器,使Vi忽略后面的{field}字段?/p>
{field} .. 此字D可选,通常用于表示此{tagname}的类型是函数、类、宏或是其它?/p>
在{tagname}、{tagfile}和{tagaddress}之间Q采用制表符QTABW,即C语言中的”\t”Q分隔,也就是说{tagname}、{tagfile}中不能包含制表符?/p>
Tag文g的开头可以包含以“!_TAG_”开头的行,用来在tag文g中加入其它信息。VIM能够识别两种q样的标讎ͼl常用到的是“_TAG_FILE_SORTED”标记Q例如:
!_TAG_FILE_SORTED<Tab>1<Tab>{anything}
上面q个标记说明tag文g是经q排序的Qƈ且排序时区分了大写Q对排序的tagQVIM会用二分法来进行查找,大大加快了查N度Q如果gؓ0Q则表示tag文g未经排序Q如果gؓ2Q则表示tag文g是忽略大写排序的?/p>
之所以在q里介绍tag文g的格式,是因为我们在后面提到的lookupfile插g中,会自q成tag文g?/p>
虽然ctags有ؓC多的选项Q但通常我们所使用的非常简单。还是以VIM 7.0的代码ؓ例,我们执行Q?/p>
cd ~/src/vim70
ctags –R src
上面q条命o会在~/src/vim70/目录下生成一个名为tags的文Ӟq个文g中包含~/src/vim70/src/目录下所?c?h文g中的标签。它一个文本文Ӟ你可以用VIM打开它看一下。此文g~省按区分字母大写排序Q所以直接可以被VIM使用?/p>
现在我们q入VIMQ执行下面的命oQ?/p>
:cd ~/src/vim70 "切换当前目录为~/src/vim70
:set tags=tags "讄tags选项为当前目录下的tags文g
现在Q我们设|好了tags选项Q接下来我们使用它:
:tag VimMain
你会看到VIM打开了src/main.c文gQƈ把光标定位到W?67行VimMain上?/p>
我们知道Q一般主E序的函数名为mainQ如果你试下面的命令:
:tag main
# pri kind tag file
1 F f main src/xxd/xxd.c
main(argc, argv)
2 FS d main src/if_python.c
46
Choice number (<Enter> cancels):
q里q没有src/main.c文gQ怎么回事呢?q是因ؓctagsq不是编译器Q它在处理编译预处理指o受到局限,因此q没有生成src/main.c中main()函数的标{。你可以在生成tag文g时给ctags指定参数来解册个问题?/p>
或者你可以?#8221;:grep”?#8221;:vimgrep”来查找mainQ这已经出本文的范围了Q因此只l出例子Q在后箋的文章再做讲解)Q?/p>
:cd ~/src/vim70
:vimgrep /\<main\>/ src/*.c
:cw
q时下面的窗口将昄出来Q在quickfixH口中找到我们想跌{的位|(本例中是src/main.cQ,按回车,可以蟩到对应的位置了?/p>
如果你只记得部分的标{Q那么可以?#8220;tag”命o的搜索模式,你可以输入一个VIM正则表达式来表示你所查找的名字,如:
:tag /\C\<\k\+ain\>
# pri kind tag file
1 F f VimMain src/main.c
VimMain
2 F d bindtextdomain src/vim.h
483
3 F d bindtextdomain src/vim.h
502
4 F d bindtextdomain src/vim.h
504
5 F f main src/xxd/xxd.c
main(argc, argv)
6 F d textdomain src/vim.h
488
7 F d textdomain src/vim.h
510
8 F d textdomain src/vim.h
512
9 FS d bindtextdomain src/gui_gtk.c
54
10 FS d bindtextdomain src/gui_gtk_x11.c
37
11 FS f cmdsrv_main src/main.c
cmdsrv_main(argc, argv, serverName_arg, serverStr)
12 FS d main src/if_python.c
46
13 FS d textdomain src/gui_gtk.c
51
14 FS d textdomain src/gui_gtk_x11.c
34
Choice number (<Enter> cancels):
q表C我x找一个以一个或多个keyword开始的标签Q此标签以ain做ؓl尾Q在查找时区分大写。要Lq个正则表达式,?#8220;:help pattern”?/p>
VIM会保存一个蟩转的标签栈,以允怽在蟩转到一个标{Q再跛_来,可以使用“:tags”命o查找你处于标{栈的哪个位|?/p>
我们l常用到的tag跌{命o见下Q一般只需要知道CTRL-]和CTRL-T可以了Q:
:tag {ident} "跌{到指定的标签
:tags "昄标签?br />
CTRL-] "跌{到当前光标下的标{?br />
CTRL-T "跛_标签栈中较早的标{?/p>
如果想了解更多命令,可以“:help 29.1”Q强烈徏议程序员完整的阅读usr_29.txt和usr_30.txtQ?/p>
如果x深入了解tag命o和相关知识,可以“:help tagsrch”?/p>
我之前写的一关于ctags和cscope的文章,参见Q?a target="_blank">Vim + Cscope/Ctags
W二节:
本节所用命令的帮助入口Q?/p>
:help helptags
:help taglist.txt
上篇文章介绍了在VIM中如何用tag文gQ本文主要介l如何用taglist插g?/p>
惛_用过Source Insight的h都记得这样一个功能:SI能够把当前文件中的宏、全局变量、函数等tag昄在SymbolH口Q用鼠标点上qtagQ就跛_该tag定义的位|;可以按字母序、该tag所属的cLscopeQ以及该tag在文件中出现的位|进行排序;如果切换到另外一个文ӞSymbolH口更新昄q个文g中的tag?/p>
在VIM中的taglist插g所实现的就是上q类似的功能Q有些功能比SI弱,有些功能比SI更强。而且Qtaglist插g仍在不断完善中!
要用taglist插gQ必LI
1. 打开VIM的文件类型自动检功能;
2. pȝ中装了Exuberant ctags工具Qƈ且taglist能够扑ֈ此工P因ؓtaglist需要调用它来生成tag文gQ;
3. 你的VIM支持system()调用Q?
在本pdW?文?vimrc初步)中,我们使用了VIM自带的示例vimrcQ这个vimrc中已l打开了文件类型检功能;在上文章中Q我们也已用CExuberant ctagsQsystem()调用在一般的VIM版本都会支持(只有suse Linux发行版中Z安全考虑Q关闭了此功?Q所以我们已l满了q三个条件?/p>
现在我们?a >http://www.vim.org/scripts/script.php?script_id=273下蝲最新版本的taglist pluginQ目前版本是4.3?/p>
下蝲后,把该文g在~/.vim/目录中解压羃Q这会在你的~/.vim/plugin和~/.vim/doc目录中各攑օ一个文Ӟ
plugin/taglist.vim – taglist插g
doc/taglist.txt - taglist帮助文g
注:windows用户需要把q个插g解压在你?VIM/vimfiles?HOME/vimfiles目录?/p>
使用下面的命令生成帮助标{(下面的操作在VIM中进行)Q?/p>
:helptags ~/.vim/doc
生成帮助标签后,你就可以用下面的命o查看taglist的帮助了Q?/p>
:help taglist.txt
Taglist提供了相当多的功能,我的vimrc中这样配|:
""""""""""""""""""""""""""""""
" Tag list (ctags)
""""""""""""""""""""""""""""""
if MySys() == "windows" "讑֮windowspȝ中ctagsE序的位|?br />
let Tlist_Ctags_Cmd = 'ctags'
elseif MySys() == "linux" "讑֮linuxpȝ中ctagsE序的位|?br />
let Tlist_Ctags_Cmd = '/usr/bin/ctags'
endif
let Tlist_Show_One_File = 1 "不同时显C多个文件的tagQ只昄当前文g?br />
let Tlist_Exit_OnlyWindow = 1 "如果taglistH口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 1 "在右侧窗口中昄taglistH口
q样配置后,当你输入“:TlistOpen”Ӟ昄如下H口Q?/p>
在屏q右侧出现的是taglistH口Q你从中可以看到在main.c文g中定义的所有tagQ宏、定义、变量、函数等Q你也可以双L个tagQ蟩到该tag定义的位|;你还可以把某一cȝtag折叠hQ用了VIM的折行功能)Q方便查看,像图中macro和variable那样。更多的功能Q请查看taglist的帮助页Q本文也会介l一些常用功能?/p>
下面介绍常用的taglist配置选项Q你可以Ҏ(gu)自己的习惯进行配|:
- Tlist_Ctags_Cmd选项用于指定你的Exuberant ctagsE序的位|,如果它没在你PATH变量所定义的\径中Q需要用此选项讄一下;
- 如果你不惛_时显C多个文件中的tagQ设|Tlist_Show_One_File?。缺省ؓ昄多个文g中的tagQ?/p>
- 讄Tlist_Sort_Type?#8221;name”可以使taglist以tag名字q行排序Q缺省是按tag在文件中出现的顺序进行排序。按tag出现的范_x属的namespace或classQ排序,已经加入taglist的TODO ListQ但未支持Q?/p>
- 如果你在想taglistH口是最后一个窗口时退出VIMQ设|Tlist_Exit_OnlyWindow为1Q?/p>
- 如果你想taglistH口出现在右侧,讄Tlist_Use_Right_Window为1。缺省显C在左侧?/p>
- 在gvim中,如果你想昄taglist菜单Q设|Tlist_Show_Menu为1。你可以使用Tlist_Max_Submenu_Items和Tlist_Max_Tag_Length来控制菜单条目数和所昄tag名字的长度;
- ~省情况下,在双M个tagӞ才会跛_该tag定义的位|,如果你想单击tagp转,讄Tlist_Use_SingleClick为1Q?/p>
- 如果你想在启动VIM后,自动打开taglistH口Q设|Tlist_Auto_Open?Q?/p>
- 如果你希望在选择了tag后自动关闭taglistH口Q设|Tlist_Close_On_Select?Q?/p>
- 当同时显C多个文件中的tagӞ讄Tlist_File_Fold_Auto_Close为1Q可使taglist只显C当前文件tagQ其它文件的tag都被折叠h?/p>
- 在?TlistToggle打开taglistH口Ӟ如果希望输入焦点在taglistH口中,讄Tlist_GainFocus_On_ToggleOpen?Q?/p>
- 如果希望taglist始终解析文g中的tagQ不taglistH口有没有打开Q设|Tlist_Process_File_Always?Q?/p>
- Tlist_WinHeight和Tlist_WinWidth可以讄taglistH口的高度和宽度。Tlist_Use_Horiz_Window为1讄taglistH口横向昄Q?/p>
在taglistH口中,可以使用下面的快捷键Q?/p>
<CR> 跛_光标下tag所定义的位|,用鼠标双Ltag功能也一?br />
o 在一个新打开的窗口中昄光标下tag
<Space> 昄光标下tag的原型定?br />
u 更新taglistH口中的tag
s 更改排序方式Q在按名字排序和按出现顺序排序间切换
x taglistH口攑֤和羃?yu),方便查看较长的tag
+ 打开一个折叠,同zo
- tag折叠hQ同zc
* 打开所有的折叠Q同zR
= 所有tag折叠hQ同zM
[[ 跛_前一个文?br />
]] 跛_后一个文?br />
q 关闭taglistH口
<F1> 昄帮助
可以?#8220;:TlistOpen”打开taglistH口Q用“:TlistClose”关闭taglistH口。或者?#8220;:TlistToggle”在打开和关闭间切换。在我的vimrc中定义了下面的映,使用“,tl”键就可以打开/关闭taglistH口Q?/p>
map <silent> <leader>tl :TlistToogle<cr>
Taglist插gq提供了很多Ex命oQ你甚至可以用这些命令创Z个taglist的会话,然后在下ơ进入VIM时加载此会话?/p>
来自Q?a >http://blog.csdn.net/easwy/archive/2007/03/01/1518468.aspx
:help 'path'
:help mksession
:help find
:help gf
:help CTRL-W_f
我们在前面介l了vimrcQvimrc定义了VIM通常的行为。每个项目都有其Ҏ(gu)的定义,虽然我们也可以在vimrc中对每个目q行定制Q但q样一来,vimrc会变得很大,使VIM启动速度变慢Q另外也会vimrc变得难以l护?/span>
因此Q我们用其它的Ҏ(gu)来保存项目相关的信息Q这是本文的主要内宏V我们将以path选项的设|ؓ例进行讲解?/span>
path选项定义了一个目录列表,在用gfQfindQ以及CTRL-W f{命令时Q如果用的是相对\径,那么׃在path选项定义的目录列表中查找相应的文件。path选项以逗号分隔各目录名。我们依旧以VIM 7.0的源代码ZQ源代码攑֜~/src/vim70/目录中)?/span>
对于q个目Q我们的path选项讄如下Q?/span>
set path=.,/usr/include,,~/src/vim70/**
E微解释一下各的含义Q更详细的信息,h看path选项的帮助页Q?/p>
. 在当前文件所在目录中搜烦
/usr/include ?usr/include目录中搜?br />
,, 在当前工作\径中搜烦
~/src/vim70/** 在~/src/vim70的所有子目录树中q行搜烦
讄了path选项后,怎么用呢Q?/p>
我们q是回到序章中的屏幕抓图Q我们把光标定位到src/main.c文gW?2行的”fcntl.h”单词上,然后在Normal模式下按”gf”。咦QVIM打开?usr/include/fcntl.h文gQ?/p>
现在我们?#8221;CTRL-^”回到刚才的位|,光标仍旧定位在第22行的”fcntl.h”单词上,然后?#8221;CTRL-W f”。啊哈,q次VIM打开了一个水q_隔窗口,在此H口中打开?usr/include/fcntl.h?/p>
管在src/main.c中未指定fcntl.h的\径,但VIM会在path选项定义的\径中搜烦此文Ӟ方便吧!
现在我们看一下find命oQ输入:
:find netrw.vim
VIM打开了~/src/vim70/runtime/autoload/netrw.vim文g。用q种Ҏ(gu)打开文g真是太方便了Q你不用输入文g的\径,VIM会自动在path选项定义的\径中搜烦。不q?#8221;find”命o也有~陷Q如果你只记得文件名的一部分Q那么就没有办法用find命o打开q个文g了。而且find命o也不允许使用正则表达式。没关系Q我们还有更好的Ҏ(gu)来打开文gQ我在后箋文章中介l这些方法?/p>
path选项介绍完了Q我们进入正题,如何把本目相关的配|保存v来,下次打开本项目时自动恢复q些配置呢?
我们有两U方法做到这一炏V?/p>
[Ҏ(gu)1]
我们在~/src/vim70/目录下徏立一个文Ӟ假定文g名ؓworkspace.vimQ文件内容ؓQ?br />
"set project path
set path+=~/src/vim70/**
q个文g中保存了目相关的信息,例如选项|键映,函数定义Q自动命令,{等。我们的例子中只定义的path选项Q我们没有?#8221;set path=…”语句Q在VIM帮助中使用”set path+=…”?#8221;set path-=…”格式?/p>
接下来,在你的vimrc文g中加入下面的语句Q?br />
" execute project related configuration in current directory
if filereadable("workspace.vim")
source workspace.vim
endif
以后Q每ơ你在~/src/vim70/目录中启动VIMӞVIM都会自动载入workspace.vimQ恢复项目的配置信息?/p>
[Ҏ(gu)2]
q记得本pd文章的第二篇“使用会话和viminfo”吗?那篇文章中,我们介绍了用会话和viminfo保存目环境的方法。如果你使用了会话,那么选项|键映,和其它很多信息都已经保存了。但会话的功能毕竟有限,不能把项目相关的配置全部保存下来Q怎么办呢Q?/p>
VIM的开发者已l想Cq个问题Qƈ提供了解军_法?/p>
在VIM载入会话文g的最后一步,它会查找一个额外的文gq执行其中的ex命o。查扄规则是,把会话文件名的后~LQ然后在后面加上“x.vim”Q。假设你的会话文件名为example.sessionQVIM׃查找是否有examplex.vimQ如果找刎ͼ׃执行此文件中的ex命o?/p>
好了Q我们先创徏我们的会话文Ӟ
:cd ~/src/vim70
:set sessionoptions-=curdir '在session option中去掉curdir
:set sessionoptions+=sesdir '在session option中加入sesdir
:mksession vim70s.vim '创徏一个会话文?/p>
然后再编辑一个名为~/src/vim70/vim70sx.vim的文Ӟ文g的内容ؓQ当Ӟ你可以在q个文g中加入更多内容)Q?/p>
"set project path
set path+=~/src/vim70/**
退出vim后,在命令行下执?#8221;gvim &”Q再ơ进入VIMQ这时看到的是一个空白窗口。然后执行下面的命oQ?/p>
:source ~/src/vim70/vim70s.vim '载入会话文g
太棒了!原来的会话环境已l恢复,q且目相关的配|也讄好了Q?/p>
来自Q?a >http://blog.csdn.net/easwy/archive/2007/02/27/1515803.aspx
:help compatible
:help mapleader
:help map
:help autocmd
Z么我的VIMq么隄Q不能语法高亮,没有折行Q不能打开多个H口多个bufferQ不?#8230;…
Z么别人用几个键就可以完成一个很复杂的功能,而我不能Q?/p>
Z么别人的VIM看v来和我的很不一P
……
当你开始问q些问题的时候,是时候去查一下你的vimrc了?/p>
当VIM在启动时Q如果没有找到vimrc或gvimrcQ它~省工作VI兼容的模式。这意味着Q你只能使用VI所具备的功能,而VIM中的大量扩展功能无法用。也许这是你的VIM如此隄的原因?/p>
VIM中自带了一个vimrc例子Q让我们从这个例子开始吧?/p>
下面我以Linux下的VIMZQwindows版本的VIMQ会在后面提到?/p>
CZ的vimrc(名ؓvimrc_example.vim)通常位于/usr/share/vim/vimXXX/目录下,其中vimXXX与你所使用的VIM版本有关?/p>
首先把这个示例的vimrc拯到相应的目录Q在Linux下,应该把它拯C的home目录下,名字?#8221;.vimrc”Q下面是shell命oQ?/p>
cp /usr/share/vim/vim70/vimrc_example.vim ~/.vimrc
或者你在VIM中执行下面的命oQ和上面的shell命o完成相同的功能:
:!cp $VIMRUNTIME/vimrc_example.vim ~/.vimrc
现在Q你退出VIM后再q入Q你的VIM和刚才已l不一样了?
你可以先M下你的vimrcQ看看它都设定了什么:
:e ~/.vimrc
q是一个注释良好的文gQ不需要多解释?/p>
对windows版本的VIMQ它已经~省的有了一个vimrcQ你可以在VIM在用下面的命o来查看它Q?/p>
:e $VIM/_vimrc
在这个文件中Q它包含了上面提到的vimrc_example.vim。同Ӟ它会把VIM讄的更W合windows的操作习惯。比如,支持CTRL-C拯QCTRL-V_脓(chung){等。Windows下的用户Q可以?VIM/_vimrc来做Z的第一个vimrc?/p>
Z提一句,在unix/linux中,文g名可以以”.”开_表明此文件是隐藏的。而在windows中,不允许文件名?#8221;.”开_所以,windows版本的VIMQ将d_vimrc来做q配置文g?/p>
在今后用VIM的日子里Q你会频J的更改你的vimrc。所以我们需要设|一些快h式,使我们能快速的讉Kvimrc?/p>
把下面这D内Ҏ(gu)贝到你的vimrc中:
1 "Set mapleader
2 let mapleader = ","
3
4 "Fast reloading of the .vimrc
5 map <silent> <leader>s :source ~/.vimrc<cr>
6 "Fast editing of .vimrc
7 map <silent> <leader>e :e ~/.vimrc<cr>
8 "When .vimrc is edited, reload it
9 autocmd! bufwritepost .vimrc source ~/.vimrc
Z方便解释Q我l每一行都加了一个行受?/p>
在vimrc中,双引号开头的行,被当作注释忽略?/p>
W?行,用来讄mapleader变量Q当mapleader为未讄或ؓI时Q用缺省的“\”来作为mapleader?/p>
mapleader变量是作用是什么呢Q我们先看下面?/p>
W?行定义了一个映,q个映射?#8220;<leader>s”Q映ؓ命o“:source ~/.vimrc<cr>”。当定义一个映时Q可以?lt;Leader>前缀。而在映射生效ӞVIM会把<Leader>替换成mapleader变量的倹{也是_我们q里定义?#8220;<leader>s”Q在使用时就变成?#8220;,s”Q当输入q一快捷方式Ӟ׃source一ơ~/.vimrc文gQ也是重新执行一?vimrc文gQ?/p>
W?行,定义?#8220;<leader>e”快捷键,当输?#8220;,e”Ӟ会打开~/.vimrcq行~辑?/p>
W?行,定义了一个自动命令,每次写入.vimrc后,都会执行q个自动命oQsource一ơ~/.vimrc文g?/p>
有了上面的快捷键Q我们就能快速的打开vimrc文g~辑Q快速重新source vimrc文gQ方便多了?br />
无论在windowsq是在linux中,我都使用VIM作ؓ我的~省~辑器。ƈ且,我想使用同一个vimrc文g。因此,我定义了一个MySys()函数Q用来区分不同的q_Q以q行不同的配|?/p>
另外Q在~辑vimrc文gӞ我更喜欢新开一个标{N来编辑,而不是在当前H口中。因此,我定义了SwitchToBuf()函数Q它在所有标{N的窗口中查找指定的文件名Q如果找到这样一个窗口,p到此H口中;否则Q它新徏一个标{N来打开vimrc文g?/p>
下面是我的vimrc中用的讑֮Q希望能够抛砖引玉:
" Platform
function! MySys()
return "linux"
endfunction
" Switch to buffer according to file name
function! SwitchToBuf(filename)
let fullfn = substitute(a:filename, "^\\~/", $HOME . "/", "")
" find in current tab
let bufwinnr = bufwinnr(fullfn)
if bufwinnr != -1
exec bufwinnr . "wincmd w"
return
else
" find in each tab
tabfirst
let tab = 1
while tab <= tabpagenr("$")
let bufwinnr = bufwinnr(fullfn)
if bufwinnr != -1
exec "normal " . tab . "gt"
exec bufwinnr . "wincmd w"
return
endif
tabnext
let tab = tab + 1
endwhile
" not exist, new tab
exec "tabnew " . fullfn
endif
endfunction
"Fast edit vimrc
if MySys() == 'linux'
"Fast reloading of the .vimrc
map <silent> <leader>s :source ~/.vimrc<cr>
"Fast editing of .vimrc
map <silent> <leader>e :call SwitchToBuf("~/.vimrc")<cr>
"When .vimrc is edited, reload it
autocmd! bufwritepost .vimrc source ~/.vimrc
elseif MySys() == 'windows'
"Fast reloading of the _vimrc
map <silent> <leader>s :source ~/_vimrc<cr>
"Fast editing of _vimrc
map <silent> <leader>e :call SwitchToBuf("~/_vimrc")<cr>
"When _vimrc is edited, reload it
autocmd! bufwritepost _vimrc source ~/_vimrc
endif
注意Q我在windows中也定义一?#8220;HOME”环境变量Q然后把_vimrc攑֜“HOME”环境变量所指向的目录中。如果你打算在windows中用上面的讑֮Q也需要这样做Q?/p>
VIM自带的示例vimrc中,只定义最基本的配|?/p>
?a >http://www.amix.dk/vim/vimrc.html有一个非常强大的vimrcQ有人戏UCؓ“史上最强的vimrc”Q或许有些言q其实。不q,如果你通读了这个vimrcQ相信能从中学到很多很多……
我的vimrc也是Z此模板,然后自已做了很多修改?/p>
Q不要照拯个vimrcQ可能这个文件的讑֮q不W合你的习惯。另外,q个文g的设定,可能也不能在你的工作环境中运行?/p>
?a >http://blog.csdn.net/redguardtoo/archive/2006/09/03/1172136.aspxQ有一个redguardtoo修改q的版本Q可以对照参考一下?/p>
[参考文档]
1. VIM帮助文g
2. http://vimcdoc.sourceforge.net/
3. http://www.amix.dk/vim/vimrc.html
来自Q?a >http://blog.csdn.net/easwy/archive/2007/02/26/1514639.aspx
太棒了,又恢复到昨天退出时的状态了Ql工作~~~~
本系列文章主要介l我自己在用VIM开发Y仉目的一些经验。本是序章Q务虚ؓ丅R?/p>
在用VIMq行软g开发之前,我用的工具是Source InsightQ相信大家ƈ不陌生。Source Insight是一个比较不错工P特别是在览代码斚w。在面对成百上千个文件组成的陌生源代码时Q用Source Insight可以让你很快的了解Y件的M程、调用关pR类型定?#8230;…。用Source Insight写代码也不错Q它的自动补全功能很强,g使用拯、粘_加上自动补全Q就可以完成代码了。不再用Source Insight的原因有二,一是Source Insight只支持windowsQ不能在Linux上用Q二是不惛_用盗版的Source Insight?/p>
在决定用VIM前,也在VIM和EMACS犹U了很久,最l懒惰的天性让我放弃了EMACSQ实在是不习惯在Ud光标Ӟ也要用两只手按住CTRL/ALT/SHIFT再加个什么键Q我的天性喜Ƣ偷懒,能用一个手指做的事Q不想用两个手指完成。所以最l选择了用VIM。现在感觉,VIM和EMACS在文本编辑方面不分伯仌ӀEMACS的优势,在于它的可扩展性,使它可以完成很多和文本编辑无关的事情Q不q这也造成了它的过于庞大?/p>
刚改用VIMQ最不适应的是不能再用鼠标“指哪儿打哪儿”了(VIM当然支持鼠标Q只是双手在键盘、鼠标间切换Q很是媄响效率)Q然 后是拯、粘_然后是查看调用关p,函数间蟩转,再然?#8230;…MQ刚开始的一D|间非常痛苦,效率也非常的低,甚至L想着攑ּ。经q这D|间以后,?渐摸C些窍门,也渐渐的知道到哪里去L帮助Q在哪儿可以扑ֈVIM的资源,工作效率一点点提升了上来。到现在Q工作中已经M开VIM了,VIM成了 计算Z~省的文本编辑工P
其实Q对VIM和EMACSq样的工h_它们最强大之处Q在于它们的可定制性。由于它们的可定制性,你完?可以定制Z个符合你自己~辑习惯的编辑器Q在q样一个编辑器里,你的工作效率达到最高。当Ӟ要达到这L境界Q你需要付出非常坚苦的努力Q如果你?工作是以文本~辑ZQ例如,你是一个程序员Q那么付U努力是值得的,也是有回报的。如果你没有很多文本~辑工作要做Q那么也没有必要耗费q么大的?气,来学习这些工兗?/p>
最后对VIM的初学者提一些徏议:
1. 如果你的工作以文本编?不是指Microsoft word中的文本~辑)ZQ那么学习VIM或EMACS是值得的;
2. 刚开始用VIM或EMACS的经历是很痛苦的Q因为它们可能完成不同于你已l习惯的windows~辑器。我的徏议是Q坚持下去!咬牙坚持下去Q你会获得回报的?/p>
3. VIM的帮助文Ӟ是学习如何高效用VIM的重要资源,一定要多读帮助文g。如果你是因为害怕读英文的帮助文件而不肯学习VIM的话Q那么,?a target="_blank">http://vimcdoc.sourceforge.net/ȝ一下,那里有翻译好的VIM 7.0的帮助文Ӟ按照说明安装好后Q再使用“:help”命oQ你可以看到翻译好的帮助文件了。如果你看到的还是英文的帮助文gQ说?#8220;helplang”选项讄的不正确Q似乎在windows上,helplang选项被设|ؓ大写的CnQ而不是cnQ所以无法看C文的help文gQ。?#8220;:set helplang=cn”命o重新讄一下helplang选项Q然后再使用“:help”命oQ就可以看到中文帮助文g了。或者你可以使用“:help xxx@cn”来查看xxx的中文帮助文件?/p>
4. 如果你是W一ơ接触VIMQ那么执行一?#8220;:help tutor”?#8220;:help tutor@cn”Q你׃看到一?0分钟的VIM教程Q会教会你VIM的一些基本命令?/p>
5. 有时间的话,一定要阅读一下Bram MoolenaarQVIM的主要作者)写的Seven habits of effective text editingQ七个有效的文本~辑习惯Q,你可以知道怎样提高你的~辑效率。在http://vimcdoc.sourceforge.net/提供的PDF文g的附录二Q你可以看到它的中文译本?/p>
本系列文章都针对VIM 7.0版本Q如果这里介l的功能在你的VIM中不存在Q不妨升U到VIM 7.0后再试一ơ?/p>
我以Linux版本的VIM 7.0Z。VIM也有支持windows的版本,可以?a target="_blank">http://www.vim.org/下蝲已经预编译好的windows版本的VIM 7.0?/p>
文章量不涉及具体的软g源代码,如果实需要,则以VIM 7.0的源代码Z。此代码可以也可以在VIM的主?/a>上下载,我把它解压在~/src/vim70目录下。以后就以此目录Zq行讲解?/p>
?图是我所使用VIM环境Q在q副图中Q我打开了三个标{NQ一个是ȝE区Q一个是打开?vimrc文gQ另外一个是草稿区。在ȝE标{N中有几个?同的H口Q分别是当前打开的bufferQ当前文件中的tagQhelpH口QlookupfileH口Qsrc/main.c和src/edit.c?其中使用了三个VIM插gQpluginQ:winmanager, taglist, lookupfile?/p>
从这副图中可以看到VIM的一些特性:多标{支持、多H口支持、插件支持、语法高亮功能、文本折叠功?#8230;…Q这些特性,以及其它C清的Ҏ(gu),我都在后箋文章中尽量给予介l?/p>
上图是GUI界面的VIMQ下图是控制C的VIM的抓图。这是我通常的开发方式:使用puttyq程d到l(f)inux服务器上Q用控制台的VIM开发YӞ 对VIM的了解有限,请多h?/p>
[参考文?/span>] 1. VIM帮助文g 2. http://vimcdoc.sourceforge.net/
]]>
下蝲地址Q?官方站点
?Ҏ(gu)qͼ The “Tag List” plugin is a source code browser plugin for Vim and provides an overview of the structure of source code files and allows you to efficiently browse through source code files for different programming languages.
滇狐评h(hun)Q?q是一个非帔R帔R帔R帔R要的插gQ?有了它, 我们才能够在 VIM 中查看一个文件中包含的函数列表, 或是一个类包含的方法列表, 为编Eh员提供了极大方便?推荐大家一定要安装Q?/p>
安装注意事项Q?有的pȝ内置?ctags 功能太弱Q?推荐大家安装 EXUBERANT CTAGSQ?q个东西功能比较强大Q?居然q?HTML 里面内嵌?Java Script 都能够支持, 实在是匪疑所思!
滇狐个h习惯Q?滇狐习惯把方法列表放在屏q的右侧Q?于是?.vimrc 中设|了
另外Q?滇狐习惯让当前不被编辑的文g的方法列表自动折叠v来, q样可以节约一些屏q空_ 于是?.vimrc 中设|了
下蝲地址Q?官方站点
官方描述Q?/p>
A few of quick commands to swtich between source files and header files quickly.
:A switches to the header file corresponding to the current file being edited (or vise versa)
:AS splits and switches
:AV vertical splits and switches
E.g. if you are editing foo.c and need to edit foo.h simply execute :A and you will be editting foo.h, to switch back to foo.c execute :A again.
滇狐评h(hun)Q?W一眼看到这个东西时Q?总觉得它功能太简单, g没有什么用处?用过之后Q?才发现这功能对于一个程序员来说是如何重要!
下蝲地址Q?官方站点
?Ҏ(gu)qͼ winmanager is a plugin which implements a classical windows type IDE in Vim-6.0. Basically, you have the directory tree and the buffer list as 2 windows which stay on the left and the editing is done in a seperate area on the left. People have already made excellent File and Buffer explorers seperately and I thought that it might be a cool idea to combine them both. winmanager.vim combines the standard File Explorer which ships with Vim 6.0 and a Buffer Explorer written by Jeff Lanzarotta into one package.
滇狐评h(hun)Q?非常好用的东西, 在屏q上打开一个文件浏览器Q?q样可以方便地选择要编辑的文g了?/p>
默认情况下, winmanager 依赖?bufexplorerQ??span class="remote">q里下蝲?如果你不喜欢 bufexplorer 插g的话 可以在你?.vimrc 中添加这条命令禁用它Q?/p>
q样׃需要下载该插g了?/p>
?狐ؓ winfileexplorer.vim 加了一个补丁, 提供了用系l默认打开方式打开选中文g的功能, 只要把光标放在想要打开的文件上Q?然后?#8220;S”可以了 (注意是大??q样以后可以直接在 gvim 里打开 Noatun 或别的播攑֙Q?不用再切换出来找 konqueror 了?/p>
下蝲地址Q?官方站点
?Ҏ(gu)qͼ When you type ‘(‘ after a function name in insert mode, the function declaration will be displayed in the command line automatically. Then use Alt+-, Alt+= to cycle between function declarations (if exists).
滇狐评h(hun)Q?一个非常好用的插gQ?虽然很小巧, 功能也很单, 但非常实用, 强烈推荐?除此之外Q?安装了这个插件后Q?当鼠标移C个标志符之上Ӟ q会出现一个气球显C标志W的定义Q?如图Q?/p>
安装注意事项Q?该插仉要安?EXUBERANT CTAGSQ?不支持古老版本的标准 ctags?创徏一个这L脚本Q?/p>
然后使用 omnictags
来运?ctags 生成 tags 文gQ?保证 tags 文g中含有所需的信息?/p>
下蝲地址Q?官方站点
?Ҏ(gu)qͼ This script is for vim 7.0 or higher it provides an omnifunc cppcomplete function. You can use the omni completion (intellisense) in c++ files.
This is a full vim script and you only need a ctags database.
滇狐评h(hun)Q?虽然滇狐几乎不依?IDE 的自动完成, 因此也很用这个插Ӟ 但ȝ说来Q?q仍然是个很的插g?/p>
安装注意事项Q?该插仉要安?EXUBERANT CTAGSQ?不支持古老版本的标准 ctags?创徏一个和前面?echofunc 中给Z脚本Q?使用那个脚本来生?tags 文g?/p>
下蝲地址Q?官方站点
?Ҏ(gu)qͼ Clewn implements full gdb support in the vim editor: breakpoints, watch variables, gdb command completion, assembly windows, etc.
滇狐评h(hun)Q?Vim 从一开始的设计哲学是要保持简单, 不要把太多的东西整合?Vim 中?Clewn 在保持了 Vim 单的原则下, 集成调试所需的一部分功能引入C GVim 中, 支持讄断点?查看变量的值等许多操作Q?非常方便?/p>
下蝲地址Q?无?自己代码复制粘贴回去, 保存?$HOME/.vim/plugins/jad.vimQ?/p>
官方描述Q?(?
滇狐评h(hun)Q?挺好玩的插gQ?不过g也只是好玩而已?安装了之后可以直接双L开 .class 文gQ?VIM 会自动调?jad 把文件反~译了?/p>
安装注意事项Q需要先安装一?jad?/p>
下蝲地址Q?官方站点
?Ҏ(gu)qͼ Cscope is a very handy tool, but it’s even better when you don’t ever have to leave the comfort of your favorite editor (i.e. Vim) to use it. Fortunately, Cscope support has been built into Vim.
滇狐评h(hun)Q?滇狐目前 cscope 用得不如 ctags 多, 许多功能都不大熟?不过既然大家都说好, 那还是装着玩玩吧?/p>
安装注意事项Q?需要安?cscope?/p>
下蝲地址Q?官方站点
?Ҏ(gu)qͼ You can use this plugin’s basic functionality to set up a list of frequently-accessed files for easy navigation. The list of files will be displayed in a window on the left side of the Vim window, and you can press
滇狐评h(hun)Q?食之无肉Q弃之有呟?/p>
安装注意事项Q?几乎没怎么用过Q?所以暂时没有发现需要注意的地方?/p>
下蝲地址Q?官方站点
官方描述Q?View a multi-byte encoded file in different encodings.
滇狐评h(hun)Q?对于亚洲用户Q?其是中国用戯言Q?q是一个非帔R要的插gQ?它能自动识别文本文g的编码, l需要编辑各U不同编码的人员提供了极大方ѝ?/p>
下蝲地址Q?官方站点
官方描述Q?/p>
Vim is undoubtedly one of the best editors ever made. LaTeX is an extremely powerful, intelligent typesetter. Vim-LaTeX aims at bringing together the best of both these worlds.
We attempt to provide a comprehensive set of tools to view, edit and compile LaTeX documents without needing to ever quit Vim. Together, they provide tools starting from macros to speed up editing LaTeX documents to compiling tex files to forward searching .dvi documents.
See the features page for a brief tour of the various features in LaTeX-suite. All these features can be tuned extensively using the included texrc file. The screenshots page shows you how a typical working session with LaTeX-suite might progress.
LaTeX-suite is made for Vim versions 6.0 and above. Installation instructions are given in the download page.
滇狐评h(hun)Q?实在是非帔R帔R帔R常好的一个插Ӟ ?VIM ?LaTeX 的朋友无论如何都要试一试, 不用 VIM ?LaTeX 的朋友也要试一试, 说不定你会改变你的主意, 改用 VIM ?LaTeX?/p>
?装注意事: 如果使用 gvim 的话Q?需要注?scim 可能会和 LaTeX Suite 有冲H?解决Ҏ(gu)是要么把 scim ?on the spot 功能LQ?或者把 gtk_im_module 设ؓ scim?(较新版本 scim W二U方??/p>
另外Q?Z提高工作效率Q?强烈配置 VIM ?a >LaTeX 正向、反向搜?/a>功能?/p>
下蝲地址Q?官方站点
官方描述Q?Sketch.vim – Line drawing/painting using the mouse. Based on an idea by Morris.
滇狐评h(hun)Q?很好玩, 虽然用到的时候不多, 但真一旦用CQ?q是会觉得这个东西很有用的?/p>
安装注意事项Q??.vimrc 中把 call ToggleSketch() 映射为命令,方便一些:
下蝲地址Q?官方站点
官方描述Q?This script create calender window. This don’t use the external program (cal).
滇狐评h(hun)Q?安装完毕后?:Calendar 命o打开一个垂直的日历H口Q?使用 :CalendarH 命o打开水^的日历窗口?应该q是比较有用的?/p>
安装注意事项Q?滇狐个h喜欢把日记的扩展名改?.txtQ?默认的是 .cal??calendar.vim 里面查找替换一下就可以了?另外Q?可以?.vimrc 里面修改日记所在的路径Q?默认?~/diary?/p>
下蝲地址Q?官方站点
官方描述Q?/p>
Whenever you start Vim (but no more than daily) the script will open a help window with a Vim tip. You must download the tips separately, from 官方站点
After installation, you can get the next tip with
滇狐评h(hun)Q?每天看一条,慢慢变?VIM 牛了?/p>
安装注意事项Q?暂时没发现?/p>
下蝲地址Q?官方站点
官方描述Q?The vimball plugin facilitates creating, extracting , and listing the contents of “vimball” archives (*.vba).
滇狐评h(hun)Q?/p>
非常的一个插Ӟ 专门用来安装其它插g的?Vimball 格式的插件安装方便, 只需?Vim 打开Q?执行一?:so %
卛_Q?无须用户自己满世界找插g的安装\径, 更无L天想着更新 helptags?滇狐已经军_所有自q写或修改的插件改?Vimball 格式了, 而且目前有越来越多的插g使用 Vimball 的格式发布, 因此大家手头上一定要备有一?Vimball 插gQ?虽然 Vim 内置了一?Vimball 插gQ?但版本太低, 许多 Vimball 无法通过它正常安装, 因此q是大家?Vim |站上下载一份最新版?Vimball 插g?/p>
下蝲地址Q?官方站点
官方描述Q?GetLatestVimScripts is a plugin that automates retrieval of the latest versions of the scripts that you yourself use!
滇狐评h(hun)Q?/p>
非常有用的一个插Ӟ 有了它, 滇狐可以时M用上最新鲜的插Ӟ 而不用不停地?Vim 主页上去看插件的更新情况了?/p>
安装注意事项Q?/p>
安装完毕后, 创徏文g ~/.vim/GetLatest/GetLatestVimScripts.dat
Q?按照q样的格式编写你的自动下载配|文Ӟ
每行写一个插件的下蝲信息?插g id 是?Vim 主页下蝲插g?URL 中的 script_id=
后面的那个数字?W二个参数是前一ơ成功下载到的插件文件编P W一ơ用的时候该参数?0Q?成功使用一ơ后会自动被修改插g最新版本的文g~号?W三个参数是该插件下载成功后是否自动安装Q?如果要自动安装的话就写上 :AutoInstall:
?滇狐不徏议用自动安装, 因此W三个参数徏议省略不要写?W四个参数是插g的名Uͼ 一般和下蝲到的插g的文件名相同Q?当然即不同也不会造成太大影响Q?q个参数主要用于防止某些插g自动自己加入到q张列表Q?q用于指定插g的下载文件名Q?更详l情况请参看该插件的文档?以下是滇狐自q GetLatestVimScripts.dat
Q?供大家参考:
~写?GetLatestVimScripts.dat
后, 打开 VimQ?q行 :GetLatestVimScripts
Q?卛_自动下蝲最新的插g?插g下蝲后存攑֜ ~/.vim/GetLatest/
中, 可以到那里找到后安装Q?安装完毕后安装文件可以删除?/p>
你现在看到的q张|页是使用 ViKi 制作的?也许它不漂亮Q?但是很清UQ?而且d信息非常方便??ViKi 滇狐从J重?Html ~辑工作中解攑և来, 使滇狐有_的勇气重新开始制作个Zc?Z更好地说?ViKiQ?滇狐该插g的用单独放?a >另一张网?/a>中?/p>
VIM 中可供用户定制的选项非常非常多, 作ؓ初学者, 我们没有必要了解q么多东ѝ?下面Q?滇狐单列Z一些最常用的配|项Q?大家可以Ҏ(gu)自己的需要将q些内容d到自q .vimrc 中?/p>
" Encoding settings
if has("multi_byte")
" Set fileencoding priority
if getfsize(expand("%")) > 0
set fileencodings=ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1
else
set fileencodings=cp936,big5,euc-jp,euc-kr,latin1
endif
" CJK environment detection and corresponding setting
if v:lang =~ "^zh_CN"
" Use cp936 to support GBK, euc-cn == gb2312
set encoding=cp936
set termencoding=cp936
set fileencoding=cp936
elseif v:lang =~ "^zh_TW"
" cp950, big5 or euc-tw
" Are they equal to each other?
set encoding=big5
set termencoding=big5
set fileencoding=big5
elseif v:lang =~ "^ko"
" Copied from someone's dotfile, untested
set encoding=euc-kr
set termencoding=euc-kr
set fileencoding=euc-kr
elseif v:lang =~ "^ja_JP"
" Copied from someone's dotfile, unteste
set encoding=euc-jp
set termencoding=euc-jp
set fileencoding=euc-jp
endif
" Detect UTF-8 locale, and replace CJK setting if needed
if v:lang =~ "utf8___FCKpd___0quot; || v:lang =~ "UTF-8___FCKpd___0quot;
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with multi_byte"
endif
// :0
//
// switch 语句之下?case 语句~进 0 个空|也就是说不羃q,?switch 块^
// 齐,使用q样风格Q?/font>
switch (x)
{
case 1:
a = b;
break;
default:
}
// g0
//
// class、struct {之下的讉K权限控制语句Q如 public、protected、private {,
// 相对 class、struct {所在的块羃q?0 个空|?class {块q齐Q用这L
// 风格Q?/font>
class foo
{
public:
int a;
private:
int b;
};
// t0
//
// 如果函数q回g函数名不在同一行,则返回值羃q?0 个空|也就是说不羃q,?/font>
// 下所C:
// set cino=t4
int
func1()
{
}
// set cino=t0
int
func()
{
}
// (sus
//
// 当一Ҏ(gu)可多行时Q其后的行羃q前?sw 指定的距,效果如下Q?/font>
int a = (1 + 2 + 3
+ 4 + 5 + 6
+ 7 + 8) * 9;
同一个配色方案, ?gvim 下和字符界面?vim 下效果大相径庭, 滇狐个h的习惯是Q??gvim 下?torte 配色Ҏ(gu)Q??vim 下?ron 配色Ҏ(gu)?因此我们有必要针?gvim ?vim q行不同的设|?/p>
另外Q?前面我们?gvim 下不使用折行Q?开启水qx动条Q?但在 vim 下, 是没有滚动条可用的, 因此q是有必要ؓ vim 保留自动折行?/p>
条g选择讄的格式如下:
if (has("gui_running"))
" 囑Ş界面下的讄
set nowrap
set guioptions+=b
colo torte
else
" 字符界面下的讄
set wrap
colo ron
endif