[转] 15分钟轻松定制基于VIM的IDE
原文地址:http://hi.baidu.com/mikeking20031/blog/item/954b6d06e12f587e03088160.html
==================================================================
本文基于Ubuntu7.10操作系统默认安装的VIM版本v7.1。
1 背景
VIM被人追捧为“无所不能”的文本编辑器,是很多Unix和Linux程序员的最爱。VIM最大的特点是扩展性极强,功能定制异常灵活。灵活性和复杂性之间通常是矛盾关系,VIM复杂的定制参数和大量的命令也使得很多新手望而却步(我曾经也是其中之一)。本文不打算介绍详细介绍VIM的定制和扩展方法,而是试图在最短的时间内、通过最简单的手段将VIM定制为一个适合程序开发的IDE。
本文介绍的定制是通过修改.vimrc文件完成,该文件位于用户的home目录下,如果不存在,创建一个。
2 语法高亮
Ubuntu7.10中VIM默认没有启用语法高亮,如果想在当前编辑窗口中使用,可以在命令模式下输入"syntax on"。但这样每次打开新文件都要重新设置,十分麻烦,所以,可以在.vimrc文件的末尾加上syntax on来默认启用语法高亮。
3 代码缩进
在.vimrc中加入
autocmd FileType * set formatoptions=tcql nocindent comments&
autocmd FileType c,cpp,java,pl,sh,py set formatoptions=croql cindent comments=sr:/*,mb:*,ex:*/,://
意思是只对c,cpp,java,pl,sh,py格式的文件启动自动缩进。你也可以加入自己的文件后缀,例如js。除了对代码段进行缩进外,该设置也对注释进行了自动缩进,例如,在注释行"/××"末尾换行,新行自动对齐到第一个×,并在行头自动加上×号。
4 自动排版
代码自动缩进的设置只对新编写的代码起作用,对于已有的代码怎么办呢?这就需要自动排版功能。
你可以在浏览模式下按1G=G进行自动排版。这对Eclipse的使用者来说很不习惯,因为在Eclipse中排版的快捷键是"ctrl + shift + f",对于习惯使用Eclipse的程序员,可以在.vimrc中加入以下两行来设置新的快捷键:
nnoremap <c-s-f> 1G=G
inoremap <c-s-f> <ESC>1G=Gi
其中第一行直接将"ctrl + shift + f"映射为1G=G,即在浏览模式下使用快捷键"ctrl + shift + f"执行1G=G的功能。第二行使得在编辑模式下也可以使用"ctrl + shift + f"进行排版。
5 代码块收放
在阅读大的代码文件时,往往需要在文件的不同部分之间进行跳转,这时,如果能把不关心的部分隐藏起来,那将大大方便代码阅读和编辑。这时代码块的收放功能就派上用场了。
代码块收放需要安装indent工具,在链接互联网的情况下使用"sudo apt-get install indent"进行安装。
在.vimrc文件中添加:
set foldmethod=indent
意思是说按缩进程度进行代码块的收放,这时需要代码的缩进是标准格式的,否则可以先通过自动排版功能进行排版。
此后,就可以在浏览模式下使用多种快捷键进行代码块的收放,常见的快捷键如下:
zR打开所有。
zM收起所有。
zc收起光标所在的块。
zo打开光标所在的块。
za将光标所在的块置为相反的状态,例如:之前状态是收起的,则打开。
6 模板
分两个层次来介绍模板的定制方法:文件级和代码级。
文件级的模板主要在创建新的代码文件时自动生成文件的结构,例如:对于Java类来说可以自动生成如下结构:
package <+PACKAGE+>;
import java.util.*;
/**
*
* @author zhengjian
*/
public class <+CLASSNAME+> {
}
需要做以下工作来实现上述功能:创建模板文件,配置模板和文件类型之间的映射。以Java模板为例:
a) 在$VIMHOME/templates下创建java.tpl,其中java是Java文件的后缀名,tpl是模板文件后缀。
b) 在.vimrc文件中添加"autocmd BufNewFile * silent! 0r $VIMHOME/templates/%:e.tpl"。意思是使用代码文件的后缀名和模板文件名进行管理。所以你可以在$VIMHOME/templates下创建一个名为html.tpl的模板文件,当使用vim创建一个新的html文件时,将自动使用html.tpl模板文件。
代码级的模板通常是一些经常编写的代码段,例如:for循环结构,这可以通过缩写功能实现。在.vimrc文件中加入命令"iabbrev <buffer> for( for (int i=0; i < var; i++) {<cr>}",则在以后编辑过程中要用到for循环结构时,只需输入"for("并按空格键,VIM便会自动使用"for (int i=0; i < var; i++) {\n}"来替换"for("。利用类似的方法,可以定制其它的代码模块,例如while循环结构等。
7 跳转
实际编写的程序都是由很多文件组成的,当阅读代码时,如果能快速地跳转到引用的文件,则会大大提高效率。VIM默认提供了这样的功能,例如:将光标移到"import org.pname.ClassName;"的ClassName上,按g f键。则VIM会搜索并打开org/pname/ClassName.java文件,搜索的范围有path选项决定。你可以在命令行下输入"set path=dir"来指定path选项值,当然你也可以将该选项值写入.vimrc文件中。gf也适用于C文件中#include包含的文件。
另外一种更为方便的跳转是,跳转到方法或属性的定义。这需要适用外部工具ctags来实现。详情见help ctags。
8 变量名补全
一般来说,适当长一些的变量名能表达能多的变量的信息,所以更值得推荐。但是在使用这种变量时,每次都输入完整的变量名的话,很麻烦,所以一般的IDE都提供变量名自动补全或提示功能,幸运的是VIM也提供类似的功能。输入要使用的变量名的前几个字母,按ctrl + p,VIM会自动补全变量名,如果有多个匹配变量名的话,则会以列表形式显示出来,你可以通过ctrl + p、ctrl + n选择合适的变量名。实际上,这不是专门用于变量名提示的,这里列出的变量名是当前窗口中(包含所有的buffer)所有满足的单词。
9 后记
本文的例子中,多次以Java文件为例。但我并不赞同使用VIM作为大型Java程序的IDE,Java语言是一种强类型语言,其类型设计和语法结构使得在编译的时候就能发现绝大部分语法错误,这种尽早发现错误的手段必定会大大提高开发效率(实际上,这也是我们常说的Java语言比较安全、适合大型程序开发的原因之一)。而编写小程序、编写脚本程序则非常适合使用VIM,因为脚本语言提供的静态类型检查功能是非常弱的,专门的IDE也不可能提供强大的静态检测功能。
10 参考资料
Kim Schulz编著的Hacking Vim
Top 10 things Vi user need to know about Vim
vim manual 正如很多人说得一样vim 的help命令信息非常丰富,善用!