上一篇介绍了 VIM 常用命令和控制台编译 Java 文件相关参数问题。这一篇重点来介绍一下关于 VIM 的插件。
VIM 的插件众多,作为打造 Java IDE ,我们需要选择一些常用也是可以被称为 IDE 所必须具备的插件。
废话不多,Go。
VIM Java IDE 插件
Pathogen:该插件用来管理Vim的插件,可以让插件的安装与卸载更加方便。配合Github和Submodule效果更佳。
NerdTree:该插件会生成工程目录树。
TagBar:该插件生成函数、变量列表。
UltiSnips:类似TextMate的snippets,是一个块补全的插件。除了 Java 还内置了市面上几乎所有流行语言的补全。也可以自定义。
vim-commentary:注释代码的插件。
syntastic:保存文件时检查语法的插件。每次保存时,编译当前 Java 文件,检查是否有语法错误。
delimitMate:成对生成(),{},[]。
buferexplorer:方便浏览buffer的插件。
TagHightlight:根据生成的Tag文件,高亮类、变量、函数和关键字。
vim-powerline:超有爱的状态栏。
javacomplete: Java 补全插件,可以像 Eclipse 一样提示对象的函数,不过有些时候会提示不出来,不知道为什么。
这些就是这一周折腾的插件,其实也还有很多的插件,大家可以参考子龙山人的博客《打造属于自己的Vim神器》。
作为 Java 开发,个人觉得这些是相当足够,如果各位还有关于 Java 的插件提供,希望可以在网站下方留言。
插件简介
Pathogen,这个插件属于 VIM 的基础插件。安装它之后,在安装上面推荐的插件是相当的方便。(这里默认是 linux 系统,如果是 windows 请查看插件 GitHub 相关介绍)
1. 将 pathogen.vim 复制到下面的文件夹下,
~/.vim/autoload/pathogen.vim
2. 控制台运行一下的命令:
mkdir -p ~/.vim/autoload ~/.vim/bundle; \
curl -Sso ~/.vim/autoload/pathogen.vim \
https://raw.github.com/tpope/vim-pathogen/master/autoload/pathogen.vim
3. 在 ~/.vimrc 中添加如下代码:
execute pathogen#infect()
重启 VIM 后便完成了 Pathogen 的安装,之后我们就可以方便安装以上推荐的所有插件了。这是
首先 cd ~/.vim/autoload/bundle 进到 bundle 目录中。记住,每次安装插件都需要 cd 到此目录。
NerdTree:
cd ~/.vim/bundle
git clone https://github.com/scrooloose/nerdtree.git
TagBar:
cd ~/.vim/bundle
git clone https://github.com/majutsushi/tagbar
UltiSnips:
cd ~/.vim/bundle
git clone https://github.com/SirVer/ultisnips
vim-commentary:
cd ~/.vim/bundle
git clone https://github.com/tpope/vim-commentary
syntastic:
cd ~/.vim/bundle
git clone https://github.com/scrooloose/syntastic
delimitMate:
cd ~/.vim/bundle
git clone https://github.com/Raimondi/delimitMate
bufexplorer:
cd ~/.vim/bundle
git clone https://github.com/vim-scripts/bufexplorer.zip
TagHighlight:
cd ~/.vim/bundle
git clone https://github.com/magic-dot-files/TagHighlight
vim-powerline:
cd ~/.vim/bundle
git clone https://github.com/Lokaltog/vim-powerline
javacomplete:
cd ~/.vim/bundle
git clone https://github.com/vim-scripts/javacomplete
通过 Pathogen 可以很方便得安装插件。我们还需要到 GitHub 查看相关说明,是否需要在 ~/.vimsrc 中进行相关的插件配置。
安装完插件,下面来看看这些插件如何使用,和相关的配置。
NerdTree
~/.vimrc 中添加如下代码:
" About NERDTree
noremap :NERDTreeToggle
autocmd vimenter * if !argc() | NERDTree | endif "open a NERDTree automatically when vim starts up if no files were specified
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary") | q | endif
之后,按 F2 便可呼出 NerdTree ,一般打开 Java 文件后,NerdTree 固定在窗口左侧,可按 F2 关闭。
TagBar
~/.vimrc 中添加如下代码:
" TagBar 自动生成参数和方法
" Then the F8 key will toggle the Tagbar window.
nmap :TagbarToggle
之后,按 F8 便可呼出 TagBar
syntastic
syntastic 需要重点说明,刚开始使用 syntastic 时发现只要是第三方 jar 包中的 class ,都无法识别,虽然编译可以通过,但代码检查报错也相当不爽。本来寻思着改 syntastic 源码,后来在官网看了关于 syntastic 的解释,了解到 syntastic 的原理。所谓代码检查,其实就是每次保存文件时,都进行 javac 编译当前文件,javac 会返回相应的错误内容, syntastic 会将错误信息加以分析,反映到 VIM 的文本上。了解了这些,我们就可以方便得使得 syntastic 接受第三方 jar 包了,也就是上篇提到的 javac 参数问题。
~/.vimrc 中添加如下代码:
"syntastic 保存检查代码时候传入参数
let g:syntastic_java_javac_args="-cp ../../lib:../../bin -sourcepath ../../bin -Djava.ext.dirs=../../lib -d ../../bin"
vim-commentary
块模式:v 命令选中需要注释的内容,gc 注释,取消注释也是同样的步骤。
V 命令,选中当前行,gc 注释当前正行内容,这个使用是最方便的,也是最多的。
bufexplorer
命令模式:\be 跳转到缓冲区窗口,然后 选择需要的缓冲区回车
javacomplete
~/.vimrc 中添加如下代码:
" 关于Java自动文件补全插件
autocmd Filetype java set omnifunc=javacomplete#Complete
autocmd Filetype java set completefunc=javacomplete#CompleteParamsInf
inoremap
inoremap
" 在VIM编辑java文件时当敲入 . 时会出发
autocmd Filetype java,javascript,jsp inoremap . .
autocmd Filetype java,javascript,jsp inoremap . .
关于 javacomplete 开始使用时候,也发现对第三方 jar 包不能进行有效的提示,至少 import 时候没有提示会让人很难受。
经过对源代码的查看,发现提供提示功能的主要是 Relfection.class ,如果想要对第三方 jar 包提供提示支持,就需要自己重新编译 class 。
下载了 javacomplete 包,发现里面有一 Relfection.java 文件,我们需要修改它,然后重新编译出 Reflection.class 就可以实现对第三方 jar 包的提示支持了。
我们搜索整个文档,查找到 user classpath 可以定位到大概 155 行的位置如图所示:
然后我们紧跟这下面,就添加自己的代码,就是在 classpath 中增加 lib 目录。如图所示:
// Troy_classpath
String troyPath = System.getProperty("user.dir") ;
String[] troyLib = troyPath.split("/") ;
StringBuilder sb = new StringBuilder() ;
for (int i=0; i sb.append(troyLib[i] + "/") ;
}
troyPath = sb.append("lib").toString() ;
File[] troyFile = new File(troyPath).listFiles() ;
for (int i=0; i if (!troyFile[i].exists())
continue;
if (troyFile[i].toString().endsWith(".jar") ||troyFile[i].toString().endsWith(".zip"))
htClasspath.put(troyFile[i].toString(), "");
else {
if (troyFile[i].isDirectory())
htClasspath.put(troyFile[i].toString(), "");
}
}
解释一下,String troyPath = System.getProperty("user.dir") ; 得到的是的当前目录,也就是点( . ) ,也就是我们在终端打开 gvim 时所在的目录。
举例,我们在 cd ~/workplace_vim/Troy/src/part2 ,然后 gvim 命令打开 gvim ,troypath 得到的就是 ~/workplace_vim/Troy/src/part2 .
紧跟着随后的代码,都是 java 的基础部分内容,不做过多解释,还得再重复一下我们所约定的目录结构:(lib 在 ~/workplace_vim/Troy/lib )
Troy
|-------bin
| |-------part1
| |-------part2
| |-------HelloWorld.class
|-------lib
|-------src
|-------part1
|-------part2
|-------HelloWorld.java
修改完 Relfection.java ,我们编译一下 javac Reflection.java 得到 Reflection.class 替换官方的 .class 文件。
发现,已经可以提供对第三方 jar 包的提示支持了,虽然在很多时候方法还是提示不出来,但是至少 import 包可以提示没有问题。
最近也会再想办法实现对第三方 jar 包里面方法的提示,如完成,会立刻更新上来。
至此为止,已经把 VIM 的所有插件都已经讲完了,其实想要配置开发环境,也就是插件的问题,只要插件都 OK ,剩下的就是熟练就行。
插件配置完成后,还有关于 ~/.vimrc 需要配置一下。
" 一键编译java文件
map :!cd %:p:h && java -cp ../../bin -Djava.ext.dirs=../../lib %:p:h:t.%:p:t:r
map :!cd %:p:h && javac -cp ../../lib:../../bin -sourcepath ../../bin -Djava.ext.dirs=../../lib -d ../../bin *.java
添加以上配置后,F5 是运行当前文件。F4 是编译当前目录下的所有 java 文件。
这里说明一下为什么有了 syntastic 插件,我们还需要 F4 编译。我们知道syntastic 插件安装完成后,每次 :w 就会自动编译当前编辑的 java 文件,如果没有错误爆出,则 class 文件其实已经编译好了,那为什么还需要添加 F4 编译 *.java 呢。
原因是这样的,在同一个包下我们新建一个 class B ,又新建一个 class A,然后 class A 中引用了 class B ,class B 中引用了 class A,这个时候,我们编译 A 会提示找不到 class B,编译 B 会提示找不到 class A 。相当于死循环。遇到这种情况,我们不能分开编译 A 和 B ,我们需要一起编译他们俩。也就是 javac *.java 就可以了,这个问题,网络上找了很久没有找到答案,有人说,代码写得有问题,通过改代码来解决,最后也是自己尝试解决。 使用 Eclipse 来做开发久了,编译这方面的知识会产生一个盲区。
也并不是说 Eclipse 不好,只是非常推荐新人在刚开始时候,不要使用 Eclipse 或者其它的任何 IDE , GVIM / Emacs / Notepad++ / UG / EverEdit / EditPlus 都可以是很好的选择,至于 windows 自带的记事本还是算了,至少找一个支持颜色高亮的编辑器。然后在控制台使用 javac 编译,java 运行。新手还是以学习为主,不需要赶进度。Eclipse 确实效率高,但学习的时候,还是任何事都亲历亲为一下。Eclipse 为我们做了大部分工作,以至于很多年之后,如果不去刻意学习,我们会对于 java 编译等等的一些问题一片空白。
现在已经完全的把工作环境从 Eclipse 移植到 GVIM ,只要进度能更得上,其实用什么编码都无所谓。
使用 VIM ,还是强烈推荐 linux 系统,做 Java 开发,也强烈建议尽早的接触 linux 。推荐一下 Ubuntu 吧,在 linux 里面,Ubuntu 占有非常重要的一席地位,作为桌面版本的 linux ,界面美观,使用起来也很方便,主要上手相对比较容易。对于还没有接触过 linux 又有意愿尝试的朋友,建议安装。
'