神用的编辑器VIM:为Fortran配置准IDE编辑环境
转载:http://hi.baidu.com/newbreed/blog/item/768fca3f6898a6cd9f3d628d.html
先看一下最终配置效果图:
好了,大家想问这是什么编辑器,窗口之间的分隔竟然是用字符而非图形,这就是VIM,和Emacs并称为神用的编辑器。关于VIM的介绍在维基百科和百度百科里都有介绍,请各取所需:WIKI http://zh.wikipedia.org/wiki/Vim 百度 http://baike.baidu.com/view/113188.htm。
这里引用WIKI上开头的一句话:“Vim是从vi发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器”。说他是神用的编辑器真是一点都不为过,因为初次接触VIM的人都被搞得一头雾水,特别对在Windows下用惯了有图形界面的用户而言更是如此。“VIM设计之初就是整个文本编辑都用键盘而非鼠标来完成,键盘上几乎每个键都有固定的用法,且VIM的制作者希望用户在普通模式(也就是命令模式,只可输入命令)完成大部分的编辑工作,将此模式设计为默认模式,初学者打开VIM,如果直接输入单词,结果就会滴滴乱响,这是因为VIM把用户输入的单词理解为命令了”——百度百科。
在最近正式开始使用VIM之前,我装过两次Emacs和一次VIM,但都被他们“蹩脚”的操作和恐怖的文字界面吓跑了,尽管他们的语法高亮非常让人着迷。这次静下心来学习VIM也多亏了前段系里搞反盗版活动,自己把用了两年多的UEStudio配置文件搞没了,当时一个劲的叹气啊~ 不过现在看来还是应该感谢SAM(Software Asset Management)。
对于写Fortran的人来说,没有好的编辑环境真的是很痛苦的事情,特别是做Project。看看用C和Java的人,真是羡慕啊,各种IDE环境,各种辅助插件,满地都是。而Fortran呢?自己写了7年代码,之前感觉最好用的就数UEStudio了,至于Visual Studio……算了,不说也罢。
ok,看了最开始两段文字,估计已经把大家吓得够呛,咱们这就开始说说为Fortran配置VIM的具体方法。VIM的配置都是通过配置文件_vimrc来完成的。下载VIM 7.2 。默认安装后,配置文件_vimrc应该在C:\Program Files\Vim目录下。要最终达到文中第一幅图的效果,需要做以下几个方面的配置:
- 编辑器基本显示设置,包括主题色彩配置、行号、缩进线等等
- Fortran语言相关配置及代码折叠
- CTags配置,
- 块代码注释插件NERD_commenter
- 使用插件NeoComplete使代码自动完成
- 使用内部功能(OmniComplete)使代码自动完成
- 多窗口插件Winmanager
在对每一项做详细的说明前,必须说一下VIM的两种模式,一、命令模式,即VIM一启动时的模式,光标显示为一个实心的矩形,这里可以输入各种命令,或鼠标操作;二、编辑模式,在命令模式下按Insert键进入,光标显示为一个竖杠杠,这里用于编写具体文件内容,切换到命令模式按ESC。所有配置文件和下文中提到的插件、字体已经打包放在这里http://cid-1c9765c3d80379d8.skydrive.live.com/self.aspx/Public/VIM/VIM%e5%ae%89%e8%a3%85%e5%8c%85.rar,供大家下载。好了,开始具体介绍:
1、编辑器基本显示设置。
用记事本打开_vimrc,然后在文中插入如下配置信息(配置文件里“ " ”表示注释行):
"打开对文件类型插件的支持
filetype plugin on
filetype plugin indent on
"窗口最大化设置(如果不想打开vim后就自动最大化,把这行删去)
au GUIEnter * simalt ~x
"字符设置,和中文显示有关
set ambiwidth=double
set fileencoding=gb18030
set fileencodings=utf-8,gb18030,utf-16,big5
"设置无备份文件
set writebackup
set nobackup
"显示行号
set nu!
"配置主题,默认安装不包括graywh主题,大家可以使用desert主题
colorscheme graywh
"语法高亮
syntax enable
syntax on
"缩进线设置,这里你可以把“|”改为你喜欢的缩进线符号,推荐使用“:”或者“.”。这里要注意的是,缩进线只有对Tab缩进有效,而空格缩进无效
set list
set listchars=tab:\|\
"配置字体,Consolas是我使用的字体名,你可以替换自己喜欢的字体,XP中不包含Consolas字体。h10表示字体大小,按自己喜好调整
set guifont=Consolas:h10:cANSI
set encoding=utf8
"设定文件浏览器目录为当前目录
set autochdir
"设置不自动换行
set nowrap
"显示下方的横向滚动条
set guioptions+=b
2、Fortran语言相关配置及代码折叠。
插入如下配置信息:
"Fortran语言制表符设置
let fortran_have_tabs=1
"设置制表符宽度,默认为8
set tabstop=6
set cindent shiftwidth=6
set autoindent shiftwidth=6
"允许Fortran代码折叠
let fortran_fold=1
"设置代码折叠的方式,这样每个program、module、subroutine、function都可以折叠了
set foldmethod=syntax
"如果前面启用了代码折叠,那么文件一打开代码全部是折叠的,需再按“zO”打开全部折叠的代码
"如果想在文件打开后所有折叠都自动展开,请加入以下配置
set foldlevelstart=99
"设置代码折叠符号(行号左侧),可要可不要,看自己喜欢了
set foldcolumn=4
设置完毕后重启VIM,打开代码文件,在命令模式下,可以为program、module、subroutine、function折叠代码,常用命令如下:
zc:折叠代码
zo:展开代码
zC:折叠所有代码
zO:展开所有代码
==============================华丽的分割线=============================
至此,针对Fortran的配置已经基本完成了,VIM已经可以正确的显示Fortran语法高亮和制表符,有缩进线显示,并将代码折叠等。下面将进阶,讲讲高级功能的配置。下面每一个功能都是独立的,你可以选择其中的某项进行配置。
==============================华丽的分割线=============================
3、CTags配置。
CTags为何物?这个……它太强大了,以至于要费很多口舌,详细的大家请自助吧 WIKI http://en.wikipedia.org/wiki/Ctags。而这里要借助CTags的是,它能让你的代码跳来跳去,呵呵~ 如果你在读程序时看了一个函数调用,或者一个变量,或者一个宏等等,你想知道它们的定义在哪儿,怎么办呢? 按Ctrl+],谁用谁知道呀,当光标在某个函数或变量上时, 按下"Ctrl+]",光标会自动跳转到其定义处,再按Ctrl+T又回来了,哈哈,神了!要使用这个神器,首先下载CTags,最新版本是5.8,http://ctags.sourceforge.net/。下载完毕解压后,将文件CTags.exe放到C:\Windows\System32目录下,这样在任何目录下都可以调用CTags了。接着要做的就是“开始->运行->cmd回车”,打开dos模式,到你的project根目录下运行命令ctags -R,注意R要大些。这样会在当前目录下生成一个tags文件,里面包含了各种变量和函数定义位置的众多信息。接下来在VIM的配置文件里加入如下的配置信息
"设置工程Tags,这里X:\Project\tags是假设的刚刚生成的Tags所在具体位置,你需要根据自己的文件位置替代
set tags+=X:\Project\tags
ok,重启VIM,打开项目中的一个文件,在命令状态下,把光标放在一个外部函数上,按Ctrl+],谁用谁知道!
4、块代码注释插件NERD_commenter。
这个插件使用很简单,下载插件http://www.vim.org/scripts/script.php?script_id=1218,将NERD_commenter.vim放到C:\Program Files\Vim\vim72\plugin目录里,然后在VIM的配置信息里加入如下信息就可以了,用Ctrl+h来回给大块代码加注释。
"对NERD_commenter的设置,映射Ctrl+h为代码注释/取消注释
map <c-h> ,c<space>
5、代码自动完成插件NeoComplete。
这里下载:http://www.vim.org/scripts/script.php?script_id=2620。下载完毕后,解压缩,将文件复制到C:\Program Files\Vim\vimfiles里。在VIM配置文件里添加如下信息:
"开启VIM后,自动使用NeoComplete
let g:NeoComplCache_EnableAtStartup = 1
看看它能干些什么,好,我们打开一个文件,然后输入字母comp,接着NeoComplete会帮我们把此文件中包含的所有匹配的关键字都罗列出来,接着按上下方向键进行选择你要的词句,然后回车输入
NeoComplete的原理是打开文件后对文件内的所有词汇进行扫描,然后储存到cache里变成词库,供后面匹配使用。你打开的文件越多,可匹配的词库就越大。不过这个插件也有个问题就是,只对打开或曾经打开过的文件进行扫描,分析后添加到词库里,对于没有扫描过的文件,就无法匹配了。
6、使用内部功能(OmniComplete)使代码自动完成。
实际上不使用插件,VIM也自带了自动完成的功能,叫做OmniComplete。它的词库构造原理是,将tags文件当作词库来使用,或者定义专门的字典文件。配置信息如下:
"设置Tags文件位置(可以设置多个tags)
set tags+=X:\Project\tags
"设置字典文件位置(根据字典文件实际位置设置)
set dictionary+=X:\Project\Dict.txt
设置完毕后,重启VIM,输入几个字母后按Ctrl+x再按Ctrl+k便可以匹配了。如果嫌麻烦可以下载Supertab插件,下载http://www.vim.org/scripts/script.php?script_id=182后,将supertab.vim放到C:\Program Files\Vim\vim72\plugin目录里,然后在VIM的配置文件里添加如下信息:
"这里表示用Tab键代替按Ctrl+x再按Ctrl+k
let g:SuperTabDefaultCompletionType = "<c-x><c-k>"
第一次使用OmniComplete进行匹配需要手动按Ctrl+x再按Ctrl+k,之后就可以用Tab键来代替了。使用OmniComplete也有自己的问题。由于它的词库是基于字典文件和Tags文件的,你在当前文件中添加的新函数和变量名无法即时加入到词库中,也就不能马上匹配。我原来想过OmniComplete和NeoComplete结合起来用,但好像不太理想,一启用NeoComplete,OmniComplete的Ctrl+x、Ctrl+k选词就不工作了。
7、多窗口插件Winmanager。
要真正把VIM改造成一个准IDE环境,你没有多窗口是不行的。而WinManager则帮你完成了这最后的任务,下载http://www.vim.org/scripts/script.php?script_id=95,之后解压缩,将得到的plugin和doc两个目录复制到C:\Program Files\Vim\vim72里。在配置文件里添加如下信息:
"配置WinManager
let g:winManagerWindowLayout='FileExplorer|TagList|BufExplorer'
let g:winManagerWidth=35 “这里设置左侧栏目的宽度
nmap <F3> :WMToggle<cr> “映射F3键为开关Winmanager
从上面的配置信息可以看到,Winmanager除了打开FileExplorer以外,还打开了TagList(需要CTags配合,把Ctags复制到sys32目录即可,不需要生成tags文件)和BufExplorer,前者可以在这里下载http://www.vim.org/scripts/script.php%3Fscript_id%3D273,后者在这里http://www.vim.org/scripts/script.php?script_id=42。重启VIM,打开你的工程中的一个文件,再按F3,Winmanager被启动,左侧栏目自上而下依次显示文件浏览器、函数列表、当前所有打开文件。在命令模式下(按ESC键从编辑模式切换),双击文件则打开,双击函数列表则自动跳到所点击的函数定义处,方便至极。不过有一点要提醒大家的是,当你打开多个文件时,如果对当前文件进行了改动但没却没有保存,这时你再通过左侧的文件浏览器或者BufferList切换文件,则主窗口会被划分成上下两块,以显示修改过但没有保存的文件,要避免这样的情况(如放弃修改内容),请在配置文件中加入以下信息:
"在打开多个文件情况下的关闭
map fc <Esc>:call CleanClose(1)<CR>
map fq <Esc>:call CleanClose(0)<CR>
function! CleanClose(tosave)
if (a:tosave == 1)
w!
endif
let todelbufNr = bufnr("%")
let newbufNr = bufnr("#")
if ((newbufNr != -1) && (newbufNr != todelbufNr) && buflisted(newbufNr))
exe "b!".newbufNr
else
bnext
endif
if (bufnr("%") == todelbufNr)
new
endif
exe "bd!".todelbufNr
endfunction
重启VIM以后,在Winmanager打开的情况下,同时打开多个文件,并且当前文件已修改却想放弃修改,可以在命令模式下按fq直接关闭,按fc保存后关闭。
至此,VIM for Fortran基本配置完毕,你可以在这个舒适的环境里编写Fortran代码了。
为了方便大家,我把文中提到的所有需要的字体、插件和配置文件都打包放在了我的Skydriver上,方便大家下载使用,地址:
https://skydrive.live.com/?cid=1c9765c3d80379d8&id=1C9765C3D80379D8!862#cid=1C9765C3D80379D8&id=1C9765C3D80379D8!1974 (原来的地址失效了,更新一下 2011.11.11)。