最近在尝试使用 Vim,有个问题请教,就
public class test {
public static void main(String args[]) {
System.out.print("shit,Test success!");
}
}
在 Vim 中,我可以直接运行调试吗,像 Sublime 的 cmd+B
一样。
ringa_lee2017-04-18 09:08:46
按題主的意思, 應該是編輯好程式碼後, 按一個快捷鍵直接自動編譯並運行.
方案
在vim
中, 可通过:!cmd
來執行外部命令. 對應於題主寫的單檔:
:!javac % #=> 编译, % 为正在编辑的文件名
:!java %:r #=> 运行, %:r 去掉文件名的后缀
原理如此, 只是接下來設定鍵映射. 在.vimrc
文件中, 添加以下內容
autocmd BufNewFile,BufReadPre *.java nmap <leader>rn :!javac %<cr>:!java %:r<cr>
意為, 新建或讀入.java
文件前, 自动映射快捷钕<leader>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
这边究竟什么情况, 我还真不知道, 但就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
你呢
更新
單檔java
檔編譯映射, 只回車一次, 減少干擾
autocmd BufNewFile,BufReadPre *.java nnoremap <leader>rs :up <bar> !javac % && java %:r<cr>
autocmd BufNewFile,BufReadPre *.java nnoremap <leader>cs :up <bar> !javac %<cr>
這樣基本上, 在同目錄下, 庫檔案用<leader>cs
编译, 执行文件用<leader>rs
來編譯運行.
這裡的rs
是run single file
的缩写, 同cs
为compile single file
.
主要是為也對應rp
和cp
. 可以使用:!mvn subcmd
来映射编译和运行项目文件. p
为project
.
PHP中文网2017-04-18 09:08:46
你好,我就是用vim開發java,可以試試我寫的一個單元測試插件,可以執行測試.
https://github.com/wsdjeg/JavaUnit.vim
當然你也可以直接用我的配置
https://github.com/wsdjeg/DotFiles
巴扎黑2017-04-18 09:08:46
map <F4> :"!javac %"<cr>
map <F5> :"!java %<"<cr>
在設定檔裡加入這兩句,F4編譯,F5運行(注意