你也用Vim寫Java代碼?

獻給全部曾試圖寫Java而痛苦掙扎的Vimers, 請不要懼怕, 我也是大家的一員java

文章源起於segmentfault論壇中的一個問題, 因爲回答的有點儘性, 便轉爲文章.python

圖片描述

題主應該是個Vim初學者, 這裏不對題主報有任何貶義的情感, 誰都是從初學過來的. 問題主要是如何在Vim中編譯運行Java代碼, 勾起了我痛苦的回憶, 便借題發揮了.算法

更況且, 做爲Vim教的一員, 自有維護我Vim臉面的義務, 最不能忍的即是質疑Vim的能力, 如xxx能這樣, Vim能嗎, 在我看來, 欺vim太甚. vim

雖然下面寫的頭頭是道, 但我其實也寫不出來, 輕拍 o(>﹏<)osegmentfault

答案

按題主的意思, 應該是編輯好代碼後, 按一個快捷鍵直接自動編譯並運行.後端

方案服務器

vim中, 可經過:!cmd來執行外部命令. 對應於題主寫的單文件:網絡

:!javac %  #=> 編譯, % 爲正在編輯的文件名
:!java %:r  #=> 運行, %:r 去掉文件名的後綴

原理如此, 只是接下來設定鍵映射. 在.vimrc文件中, 添加如下內容架構

autocmd BufNewFile,BufReadPre *.java nmap <leader>rn :!javac %<cr>:!java %:r<cr>

意爲, 新建或讀入.java文件前, 自動映射快捷釹<leader>rn到指定命令.eclipse

固然你也能夠設置成兩個快捷鍵. 這裏並不推薦使用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橫空出世後, 才搞出來的. 在這以前, GNUg++是不會共享語法分析的數據的. 你得本身寫一個語法分析器, 對, 給C++..., 才能進行智能補全.

那麼, Java這邊究竟什麼狀況, 我還真不知道, 但就Java95年就搞出來, vim91年就搞出來了, 它倆共渡的日子少算也有20年了, 在這期間, 各類Java IDE導出不窮, 但也沒見誰搞出個屎來.

YCMJava提供的補全, 使用eclim, 它和YCM沒有關係, YCM只是提供接口, eclim沒有YCM也能正常工做. eclim插件的使用, 須要安裝eclipse, Java界以緩慢開源著稱的IDE. 也就是說, eclim在底層使用eclipse來補全. 若是你不介意超緩慢的啓動速度和補全速度, 能夠一試.

這簡直不能忍, 題主橫刀立馬, 開始着手用C++寫個Java的語法分析器, 作成C/S架構, 在插件中與服務器溝通來補全. 你也能夠直接給YCM寫個Java後端.

聽說, Java語法規範頁數已經超過C++. 但沒事, 沒有困難也要創造困難上, 更況且是有困難呢.

至此, 我已經給題主指明瞭一條通神之路, 翻過荊棘, 你將一躍成爲vimJava兩界永遠的大神, 完全終結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
你呢
相關文章
相關標籤/搜索