献给所有曾试图写Java而痛苦挣扎的Vimers, 请不要害怕, 我也是你们的一员
序
文章源起于segmentfault
论坛中的一个问题, 由于回答的有点尽性, 便转为文章.
题主应该是个Vim
初学者, 这里不对题主报有任何贬义的情感, 谁都是从初学过来的. 问题主要是如何在Vim中编译运行Java代码
, 勾起了我痛苦的回忆, 便借题发挥了.
更何况, 作为Vim
教的一员, 自有维护我Vim
脸面的义务, 最不能忍的便是质疑Vim
的能力, 如xxx能这样, Vim能吗
, 在我看来, 欺vim
太甚.
虽然下面写的头头是道, 但我其实也写不出来, 轻拍 o(>﹏<)o
答案
按题主的意思, 应该是编辑好代码后, 按一个快捷键直接自动编译并运行.
方案
在vim
中, 可通过:!cmd
来执行外部命令. 对应于题主写的单文件:
:!javac % #=> 编译, % 为正在编辑的文件名
:!java %:r #=> 运行, %:r 去掉文件名的后缀
原理如此, 只是接下来设定键映射. 在.vimrc
文件中, 添加以下内容
autocmd BufNewFile,BufReadPre *.java nmap rn :!javac %:!java %:r
意为, 新建或读入.java
文件前, 自动映射快捷钕
到指定命令.
当然你也可以设置成两个快捷键. 这里并不推荐使用Command
快捷键, 而是使用Leader
. 而事实上, 终端的vim
也不能映射Command
, 只有MacVim
可以.
进阶一: 多文件
多文件其实也没什么, 只是在javac
时, 换%
为*.java
, 换%:r
为真正的main
所在文件名.
进阶二: 项目
如果你的项目有固定的结构, 本质上是差不多的.
在编译时, 可能添加-cp
选项指定依赖路径, 添加-d
选项指定输出路径. 如要打包为jar
, 再加快捷键.
你可以在项目根目录定义一个.project
属性文件, 描述项目结构和依赖, 再用VimL
语言或python
语言, 读取属性文件, 分别编译再输出. 至于依赖, 去~/.m2/
目录找, 它们的位置非常有规律.
现在, 你可以将键映射到上述操作了, 不就是快捷键吗, vim
多的是. 除了Ctrl/Alt/Shift
, 还有每个字母和数字, 还有leader
加任意长度字母和数字, leader
不够了, 还是mapleader
前缀. 对了, 你可能更喜欢F1-F12
.
进阶三: 依赖
OK, 你基本上已经重新发明了maven
了, 只是差自动下载依赖的功能. 但python
的网络库那么多, 我猜测mvn
的仓库应该是对外开放的, 只要遵循相关协议就能下载. 包与包之前有依赖关系, 你可以用python
再写个依赖处理算法.
虽然VimL
残的跟渣一样, 但我们支持python
啊, Ruby
啊, Lua
啊, 总有一款你喜欢的语言接口. 什么你觉得运行慢, 不要紧, 用C++
写, 做成C/S
架构的, 你看看YCM
人家怎么实现的, 仿照一个呗.
终极: 补全
好了, 编译运行打包依赖都解决了, 但也撑死算一个项目管理插件. 写Java
没有补全, 那么多API
, 那么长的方法名, 还有各种样板写法和各种奇怪的异常抛出, 手写Java
代码真是力气活, 还拼脑容量.
这怎么行, 必须搞个补全插件. Vim
界补全的王者YCM
是在Clang
横空出世后, 才搞出来的. 在这之前, GNU
的g++
是不会共享语法分析的数据的. 你得自己写一个语法分析器, 对, 给C++
..., 才能进行智能补全.
那么, Java
这边究竟什么情况, 我还真不知道, 但就Java
95年就搞出来, vim
91年就搞出来了, 它俩共渡的日子少算也有20年了, 在这期间, 各种Java IDE
导出不穷, 但也没见谁搞出个屎来.
YCM
对Java
提供的补全, 使用eclim
, 它和YCM
没有关系, YCM
只是提供接口, eclim
没有YCM
也能正常工作. eclim
插件的使用, 需要安装eclipse
, Java
界以缓慢开源著称的IDE
. 也就是说, eclim
在底层使用eclipse
来补全. 如果你不介意超缓慢的启动速度和补全速度, 可以一试.
这简直不能忍, 题主横刀立马, 开始着手用C++
写个Java
的语法分析器, 做成C/S
架构, 在插件中与服务器沟通来补全. 你也可以直接给YCM
写个Java
后端.
据说, Java
语法规范页数已经超过C++
. 但没事, 没有困难也要创造困难上, 更何况是有困难呢.
至此, 我已经给题主指明了一条通神之路, 翻过荆棘, 你将一跃成为vim
和Java
两界永远的大神, 彻底终结Vim
不适合写Java
的诅咒. 两派子弟必将永久膜拜朝奉.
如果你写出来时, Java
还活着的话..., JVM
平台的兄弟语言有点多...
为什么不说vim
啊, 因为vim
教永生!!!
后记
特此声明, 本文不包含任何对题主的调侃或戏谑或嘲讽或质疑什么的, 如让题主不爽, 我也不会道歉.
说这些, 只是说, 对于vim
真没什么不可能的, 只要你有只够的技能时间. 这主要因为vim
只是一个编辑器, 它把该开放的接口都开放了, 你想干什么, 写插件就OK了. Vim
的中文手册, 抛开一些更新日志, 至少有1500
页. 即便你看完了, 也不见得会写插件, 还要看书. 只就Vim
的快捷键和操作, 我粗略了记了一下前300页的用户指南, 笔记就记了1000
多行, 这还是精简到估计只有我自己能看懂.
通常, 在这个问题上, Vim
提供了:make
接口来编译, 和makeprg
来设置编译参数. 但也要承认, Vim
设计之初, 大部分的设计都是为C
这样的编译语言做的, 像文本对象a{
是选择{}
中的代码, 但对于python
来说, 块代码是同缩进的代码, 没有{}
, 对Scala
来说, 块只有一条语句时, 可以省略{}
.
献给所有曾试图写Java而痛苦挣扎的Vimers, 请不要害怕, 我也是你们的一员
Vim
并不完美, 但比绝大多数Vimer
相像的要完美.
我相信, 每个初学Vim
, 并被Vim
的强大折服的人, 都曾试图豪言, Vim在手, 天下我有
. 然后, 在工作中碰到了Java
, 陷入装逼痛苦的泥淖中, 然后, 要么决定找一份别的工作, 要么用上了IDE
. 待再次回头, 便看到了Vim
的局限.
看到一个工具的强大并不是了解, 看到它的局限才是真正的了解.
黄色的树林里分出两条路
而我选择了IDE
你呢