獻給全部曾試圖寫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
橫空出世後, 才搞出來的. 在這以前, 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 你呢