说到 VIM,网路上的教程真的是多如牛毛,大部分的教程作者都狂热的 VIM 爱好者,在他们眼里 VIM 是一切,他们用 VIM 上网,收发邮件,听音乐,发博客,刷微博……
但对于新手来说,这些教程非但不客观,还非常不容易上手,跟着它们做会遇到各种各样的问题。
最近花了将近一个星期的时间才配置了一个 VIM 的 Java 的开发环境, 相对于 Eclipse 来说功能确实差了一点,但比起一般的文本编辑器来说,功能是相当的强大。这里感谢那些为 VIM 开发插件的大神们。
网路上把 VIM 打造成 IDE 的教程很多,但如果说要把 VIM 打造成 Java IDE,网路上那些也仅仅是简单介绍安装两个插件就草草了事,真拿来做开发,有相当多的不足。
下面就来讲讲如何将 VIM 打造成 Java IDE,不能说这个教程是最好,也最起码在细节方面符合一个 Java 开发者的要求了。
写在前面
在接触了 Ubuntu 之后,就决定了要在 VIM 和 Emacs 之间选择一个。VIM 和 Emacs 两个本来就都用过,快捷键都知道,只是不熟悉。
在打算熟练其中一个的时候,开始选择是 Emacs。选择 Emacs 是由于 Dvorak 键盘,使用了四年了 Dvorak ,考虑到 VIM 在 Dvorak 下快捷键凌乱,所以选择了 Emacs 。
但 Emacs 所有快捷键都是两个按键,通过 Ctrl / Alt / Shift 组合完成各种操作,在使用了一段时间之后,实在是适应不了,也就不了了之。
后来工作中开始频繁使用 SSH / Telnet 登录 AIX / Unix,VI 接触多了开始渐渐习惯,也渐渐喜欢上了 VI 的各种操作。于是开始从 Emacs 转向 VIM。
就目前的使用情况来看,Dvorak下 VIM 基本没有不习惯,所有的快捷键都还算比较合理,由于本人是先使用 Dvorak 后使用的 VIM ,对于QWERTY下的 VIM 有多舒服,也就没有发言权了。
现在唯一的问题是:在 QWERTY 下,可以使用 替代 Esc 的方案在 Dvorak 下略有不顺手。
现在的电脑是这样的局面:Ubuntu系统 + Dvorak键盘布局 + VIM 编辑器,当然 Eclipse 也是必备 IDE 。
VIM 常用命令
人们说 VIM 的魅力在于 VIM 的插件,表示赞同。但是如果你对 VIM 常用的命令不熟悉,请不要考虑使用 VIM 打造 Java IDE。请先把 VIM 作为平常的默认文本编辑器使用,熟悉一两个月 VIM 常用命令。
VIM 命令很多,在这里列出一些本人工作中常用到的,也是非常常见的命令。
移动命令
h 光标向左移动
l 光标向右移动
j 光标向下移动
k 光标向上移动
插入命令
a 光标移动至所在位置的后方,并进入插入模式
A 光标移动至当前行的最后,并进入插入模式
i 光标所在位置,进入插入模式
o 光标移动至所在行的下一行,进入插入模式
O 光标移动至所在行的上一行,进入插入模式
删除命令
x 删除一个光标所在处的字符
3x 删除从当前光标开始,向后3个字符,以此类推:10x,20x……
dd 删除光标所在的行
3dd 删除光标所在行开始,向下3行,以此类推:10dd,20dd
dw 删除光标所在处开始,到第一个空格之间的所有字符
daw 删除光标所在处整个单词,往前数第一个空格(或 点 "." 或 括号 "(" ),往后数第一个空格(或 点 "." 或 括号 "(" )之间的所有字符.
替换命令
r 用输入的字符,替换光标所在位置的字符
跳转命令
3g 跳转到整个文本文件的第三行,以此类推:10g,20g,256g…… 需要配合显示文本行号功能一起使用。
G 跳转到整个文件的末尾一行。
查找命令
/ 然后输入字符,回车,会高亮查找到的内容。命令模式下输入 n 向下查找下一个需要查找的内容,N 向上查找上一个需要查找的内容。
# 查找光标所在处的单词
:nohl 取消查找当前关键字的高亮显示(不会永久关闭,只是当此查找高亮去除)
撤销
u 撤销刚才的操作,可多次撤销(后退)
Ctrl + R 撤销刚才的撤销(前进)
合并
J 合并当前行和下一行(去除当前行和下一行之间的空格)
文本选择
v 进入块模式,配合 j k h l,可以选中单个字符(以字符为单位进行选中)
V 进入块模式,配合 j k ,可以选中多行(以行为单位进行选中)
y 复制当前选中的字符或行进入 VIM 剪贴板
p 粘帖 VIM 剪贴板中的内容
注意:VIM 下所有删除操作包括 x ,dd, dw,都会将字符复制进入剪贴板
VIM 的剪贴板与系统剪贴板是相互独立的,想要直接使用系统剪贴板,可以这样:v 进入块模式,选中字符,然后 (”+y)(不包括括号,但是包括 + 号) 其中 “+ 是系统剪贴板的名称,y表示复制内容到系统剪贴板,当然,在系统中复制的内容如果想要粘帖到 VIM ,可以在命令模式下输入(”+p) ,“+ 表示系统剪贴板,p 表示粘帖。
窗口命令
Ctrl + w + h 表示光标移动到左边的分割窗口
Ctrl + w + l 表示光标移动到右边的分割窗口
Ctrl + w + j 表示光标移动到下面的分割窗口
Ctrl + w + k 表示光标移动到上边的分割窗口
此命令在使用某些插件的时候会经常使用
关闭保存
ZZ 关闭当前分割窗口,如果当前窗口没有分割,则退出 VIM
:q 退出 VIM
:w 保存当前文件
:wq 保存并退出
以上是工作学习中使用 VIM 不可避免的常用命令。
记事本 Java 开发目录结构
使用记事本做 Java 开发,没有了 IDE 为我们合理的管理 Java 文件,我们就需要自己安排好文件的目录结构。
我们当然也可以所有的文件都堆到一个文件夹里面,java / class / jar 都在一个文件夹里面,如果用到了内部类,那整个文件夹是相当的混乱。
于是就参考了 Eclipse 的目录结构,将 .java文件 .class文件 .jar 文件分别分开放置。
Troy
|-------bin
| |-------part1
| |-------part2
| |-------HelloWorld.class
|-------lib
|-------src
|-------part1
|-------part2
|-------HelloWorld.java
可以看到上面的目录结构:
Troy工程名
bin 存放编译的 class 文件
src 存放所有的 java 文件
lib 存放所有的第三方 jar 包
如图:
开发的时候,首先建立 Troy(工程名文件夹),在 Troy 下建立 bin / lib / src 三个文件夹, Java 就是第三方 jar 包多,统统都放到 lib 目录下。
然后在 src 目录下 自己建立包名,这里演示是 part2, 进入到 part2 目录建立一个 HelloWorld.java 文件
如图:
相对来说,这样的目录结构对于 Java 开发是很清晰的,class文件 / Java文件 / jar文件都归类存放。
这里需要注意的是,有主方法,也就是 main 方法的 java 文件的 package 必须和我们文件夹的名字一样。即,这里的 HelloWorld,有主方法,所在文件夹是 part2 ,第一行必须是 package part2,不能更改其它名字。如果是没有主方法的类,则 package 其它的名字也可以。这个也是为了配合 VIM 的特性和 Java 命令,需要注意的地方。
关于 Javac 和 Java
抛开 IDE 做 Java 开发并不是第一次,大三到大四两年时间,所有的开发都是在 Notepad++ 上完成的,包括毕业设计。当时只有颜色高亮,没有任何提示,完全依靠 JavaAPI 和 原生的 Notepad++。
回头想想这是一件痛苦的事情,但是作为初学,所带来的好出也是不言而喻,对 Java 基础类的结构变得非常的清晰。
这里会遇到一个很大的问题(尤其是一开始就使用 Eclipse 或者 MyEclipse 或者其它 IDE 开发的同学),那就是 javac 命令编译 java 命令的问题。
如果说把所有文件都堆到一个文件夹里去做 Java 开发,那也就完全没有问题。
javac *.java 搞定!
问题就出在,我们需要一个良好的目录结构,即上一部分讲到的目录结构。
请问,如何编译 java 文件,才能即引入 lib 中的第三方 jar 包,又让 编译产生的所有 class 都在 bin 目录下?
答案涉及 javac 的参数问题。
先看编译命令:
javac -cp ../../lib:../../bin -Djava.ext.dirs=../../lib -d ../../bin HelloWorld.java
这里由于使用的系统是 Ubuntu ,所以目录之间使用的是 :冒号隔开,如果是 windows ,请自行替为 ; 分号
-cp ../../lib:../../bin 编译过程中需要引入 class 所在的文件夹的路径,linux用 冒号 分隔,windows 用 分号 分隔
-Djava.ext.dirs=../../bin 告诉系统,引入的第三方 jar 包存放的目录,如有引用第三方 jar 包编译时会通过此参数到相应的路径下查找
-d ../../bin 编译后的 class 文件都存放到 ../../bin 目录,也就是 bin 目录下
当通过编译后,bin 目录下,会出现一个 part2 文件夹,里面是 HelloWorld.class
然后是运行命令:
java -cp ../../bin -Djava.ext.dirs=../../lib part2.HelloWorld
这里也需要指定 class 的目录,jar 包的目录。特别需要注意的是 包名 part2.HelloWorld ,单单写 HelloWorld 则运行出错。
还有一个注意点就是,上面的 ../../bin 写的是相对路径,相当于写死了。相对的是 HelloWorld 所在的目录,我们工作的目录一定要转移到 part2 目录中。把 part2 作为当前目录。当然,如果也可以选择 part3 ,也可以是你所建立的任何名字的文件夹。
使用 Gvim 开发时也需要注意这一点。
在了解了这些问题之后,来讲如何把 VIM 打造 Java IDE 才有基础也才有意义。
下一章将重点讲一讲如何配置 VIM 的相关 Java 插件
'