搜索

首页  >  问答  >  正文

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

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

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

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

大家讲道理大家讲道理2892 天前330

全部回复(6)我来回复

  • ringa_lee

    ringa_lee2017-04-18 09:08:46

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

    方案

    vim中, 可通过:!cmd来执行外部命令. 对应于题主写的单文件: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

    黄色的树林里分出两条路
    而我选择了IDE
    你呢

    原理如此, 只是接下来设定键映射. 在.vimrc文件中, 添加以下内容🎜
    autocmd BufNewFile,BufReadPre *.java nnoremap <leader>rs :up <bar> !javac % && java %:r<cr>
    autocmd BufNewFile,BufReadPre *.java nnoremap <leader>cs :up <bar> !javac %<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++ ..., 才能进行智能补全.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

    那么, 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来说, 块只有一条语句时, 可以省略{}.Vim提供了:make接口来编译, 和makeprg来设置编译参数. 但也要承认, Vim设计之初, 大部分的设计都是为C这样的编译语言做的, 像文本对象a{是选择{}中的代码, 但对于python来说, 块代码是同缩进的代码, 没有{}, 对Scala来说, 块只有一条语句时, 可以省略{}.

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

    Vim并不完美, 但比绝大多数Vimer相像的要完美.

    我相信, 每个初学Vim, 并被Vim的强大折服的人, 都曾试图豪言, Vim在手, 天下我有. 然后, 在工作中碰到了Java, 陷入装逼痛苦的泥淖中, 然后, 要么决定找一份别的工作, 要么用上了IDE. 待再次回头, 便看到了Vim的局限.

    看到一个工具的强大并不是了解, 看到它的局限才是真正的了解.

    rrreee

    更新

    单文件java文件编译映射, 只回车一次, 减少干扰

    rrreee

    这样基本上, 在同目录下, 库文件用<leader>cs编译, 执行文件用<leader>rs来编译运行.

    这里的rsrun single file的缩写, 同cscompile single file.

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

    献给所有曾试图写Java而痛苦挣扎的Vimers, 请不要害怕, 我也是你们的一员🎜
    🎜Vim并不完美, 但比绝大多数Vimer相像的要完美. 🎜 🎜我相信, 每个初学Vim, 并被Vim的强大折服的人, 都曾试图豪言, Vim在手, 天下我有. 然后, 在工作中碰到了Java, 陷入装逼痛苦的泥淖中, 然后, 要么决定找一份别的工作, 要么用上了IDE. 待再次回头, 便看到了Vim的局限.🎜 🎜看到一个工具的强大并不是了解, 看到它的局限才是真正的了解.🎜 rrreee
    🎜更新🎜
    🎜单文件java文件编译映射, 只回车一次, 减少干扰🎜 rrreee 🎜这样基本上, 在同目录下, 库文件用<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运行(注意<F4><F5>后面的空格),当然前提是你装了jdk并配置好环境变量。调试感觉不行

    回复
    0
  • 取消回复