献给所有曾试图写Java而痛苦挣扎的Vimers, 请不要害怕, 我也是你们的一员

文章源起于segmentfault论坛中的一个问题, 由于回答的有点尽性, 便转为文章.

题主应该是个Vim初学者, 这里不对题主报有任何贬义的情感, 谁都是从初学过来的. 问题主要是如何在Vim中编译运行Java代码, 勾起了我痛苦的回忆, 便借题发挥了.

更何况, 作为Vim教的一员, 自有维护我Vim脸面的义务, 最不能忍的便是质疑Vim的能力, 如xxx能这样, Vim能吗, 在我看来, 欺vim太甚.

虽然下面写的头头是道, 但我其实也写不出来, 轻拍 o(>﹏

答案

按题主的意思, 应该是编辑好代码后, 按一个快捷键直接自动编译并运行.

方案

在vim中, 可通过:!cmd来执行外部命令. 对应于题主写的单文件:

:!javac % #=> 编译, % 为正在编辑的文件名

:!java %:r #=> 运行, %:r 去掉文件名的后缀

原理如此, 只是接下来设定键映射. 在.vimrc文件中, 添加以下内容

autocmd BufNewFile,BufReadPre *.java nmap rn :!javac %:!java %:r

意为, 新建或读入.java文件前, 自动映射快捷钕rn到指定命令.

当然你也可以设置成两个快捷键. 这里并不推荐使用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这边究竟什么情况, 我还真不知道, 但就Java95年就搞出来, vim91年就搞出来了, 它俩共渡的日子少算也有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

你呢

vim java 编程_你也用Vim写Java代码?相关推荐

  1. 质量不同的球java编程_荐非常经典的java编程题全集-共50题(1-10)...

    非常经典的java编程题 程序1:斐波那契数列问题 题目概述: 古典问题: 有一对兔子,从出生第三个月起每月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多 ...

  2. 课程设计代写java,JAVA课程设计作业代做、代写JAVA编程设计作业、代写data留学生作业...

    JAVA课程设计作业代做.代写JAVA编程设计作业.代写data留学生作业 日期:2020-06-13 11:30 JAVA Coursework (30 marks) Suppose you nee ...

  3. java收费学java,讷河学java编程,讷河java编程学习的学校,讷河java编程学习一般怎么收费...

    讷河学java编程,讷河java编程学习的学校,讷河java编程学习一般怎么收费 首页 > 软件 > 讷河学java编程 作者:镀金池   发布时间:2019-02-20 07:00 Gr ...

  4. java编程思想企业版Enterprise Thingking in java

    java编程思想企业版Enterprise Thingking in java 文档默认是英文版本,但是这个文件是HTML文档,我们只需要把它拖进浏览器中就行了,然后用我们熟悉的谷歌翻译就可以搞定了. ...

  5. 交换最大数与最小数java编程_善知教育笔记之JavaSE_Java编程基础

    1 Java编程基础 1.1 变量 1.1.1 变量 变量是什么?为什么为用变量? 变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据.根据所存储的数据类型的不同,有各种不同类型的变量.变量 ...

  6. java超线程_超线程多核心下Java多线程编程技术分析

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...

  7. JAVA结课_一点心情,写java结课考试之前

    突然发现,已经好久没有上来写blog了,本来还以为能够天天写,后来发现,确是心有余力而不足啊.学期进入中段,课业慢慢多了,各种各样的事情也接踵而来了.本学期的java课程也已经结课了,8周32个学时, ...

  8. java和python混合编程_浅谈C++与Java混合编程

    在学习编程的过程中, 我觉得不止要获得课本的知识, 更多的是通过学习技术知识提高解决问题的能力, 这样我们才能走在最前方, 更 多 Java 学习,请登陆疯狂 java 官网. 现实的情况是, 真实的 ...

  9. vim插件安装_如何安装Vim插件

    vim插件安装 尽管Vim快速高效,但默认情况下,它只是一个文本编辑器. 至少,这就是没有插件的情况,插件基于Vim并添加了额外的功能,使其不仅具有键入文本的窗口,还具有更多的功能. 正确搭配各种插件 ...

最新文章

  1. Linux 技巧:谈 Linux GNU 实用工具兼容性
  2. LeetCode 421. 数组中两个数的最大异或值(Trie树)
  3. java excel 冻结_Java 冻结或解除冻结Excel中的行和列
  4. cad画直线长度与实际不符_CAD问题,画线长度不对?
  5. 联想M7400Pro打印满张纸黑
  6. 怎么把腾讯视频的qlv文件转成mp3格式 【已解决】
  7. vue子组件修改父组件的值
  8. matplotlib显示伪彩色图像及色度条
  9. Lombok @Data导致的hashCode的问题
  10. Hbase入门(一)
  11. 防止PCB会过期,以及过期后的处理办法
  12. java线程池的应用_Java线程池的使用
  13. BUUCTF:[GKCTF2020]Sail a boat down the river
  14. ATAx=0与Ax=0同解
  15. 【VUE】【Echarts】绘制图表组件
  16. Linux 命令行批处理图片,批量去除截图的无用部分
  17. 基于Linux的C++轻量级web服务器/webserver/httpserver——线程池
  18. 易语言隔行扫描算法 支持库
  19. 使用ABP实现SwaggerUI,生成动态webapi
  20. 第三人称游戏开发-常用代码(1)

热门文章

  1. js构造函数的实例成员和静态成员
  2. 速度收藏!《阿里技术参考图册》发布,公开600页技术全景图
  3. 四、对select下拉框的处理需要标签为tagName为select的标签才方便进行操作
  4. 校园网认证明文传输获取校园网账号密码
  5. 前插法和后插法建立单链表
  6. springboot分页pageable实现简单实用
  7. 解决ewomail域不允许
  8. 使用Safari获取手机UDID,对.mobileconfig文件进行签名加密
  9. 加载/保存 .pt 文件
  10. arp攻击(arp攻击解决办法)