搜尋

首頁  >  問答  >  主體

java - Vim可以直接运行代码吗

最近在尝试使用 Vim,有个问题请教,就

public class test {
    public static void main(String args[]) {
        System.out.print("shit,Test success!");
    }
}

在 Vim 中,我可以直接运行调试吗,像 Sublime 的 cmd+B 一样。

大家讲道理大家讲道理2893 天前335

全部回覆(6)我來回復

  • ringa_lee

    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横空出世后, 才搞出来的. 在这之前, 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
    你呢

    更新

    單檔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來編譯運行.

    這裡的rsrun single file的缩写, 同cscompile single file.

    主要是為也對應rpcp. 可以使用:!mvn subcmd来映射编译和运行项目文件. pproject.

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 09:08:46

    沒看到產生了 test.class 嗎?


    應該是可以的,但,是需要插件來支援。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 09:08:46

    不可以,vim本身不具備編譯器連結功能,是否可配置或有相關插件支援尚不知道

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 09:08:46

    你好,我就是用vim開發java,可以試試我寫的一個單元測試插件,可以執行測試.
    https://github.com/wsdjeg/JavaUnit.vim

    當然你也可以直接用我的配置

    https://github.com/wsdjeg/DotFiles

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 09:08:46

    正常來說不可以,因為vim無法編譯產生class檔案

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:08:46

    map <F4> :"!javac %"<cr>
    map <F5> :"!java %<"<cr>

    在設定檔裡加入這兩句,F4編譯,F5運行(注意後面的空格),當然前提是你裝了jdk並配置好環境變數。調試感覺不行

    回覆
    0
  • 取消回覆