在Vim中更高效地编译Java代码

25

我来自Eclipse的背景,但我喜欢Vim作为文本编辑器。我目前正在尝试将Vim用作Java IDE。目前我这样编译:

! javac MyClass.java

跟随。
! java -cp . MyClass

如果我有编译错误,我必须使用!返回编译器输出,并手动跳转到每个产生错误的行。并且一旦我开始添加其他类,我就必须分别编译它们。
肯定有比这更有效率的方法。在我当前低效的Vim工作流下,我可以在图形化IDE中更快地完成任务,这违背了我使用Vim的目的。
我想能够在包含我的主要方法的类中输入:compile之类的内容来编译所有源代码,并呈现一个分屏的错误消息列表。你有什么建议?

与我个人无关,但相关的内容:


更新: 我从这个问题中得出的结论已经发布在单独的答案中。


你是否知道Eclipse有Vim插件,甚至还可以在Vim中使用Eclipse的"插件": http://vrapper.sourceforge.net/home/ - http://eclim.org/ - http://www.google.de/search?q=eclpise+vim - RoToRa
让我们想到了Make文件或(Java!)Nant文件。 - sehe
你应该考虑使用:cwindow而不是:copen。:cwindow仅在出现任何编译错误时打开“errorview”。 - Mathias Bak
嗨,@Pieter;你能将你解释如何使用答案的编辑移动到一个单独的回答中吗?它看起来是有用的信息,但不应包含在问题中;你可以将其作为答案发布。谢谢。 - Keith Pinson
我编辑了帖子并创建了回答。 - Pieter
显示剩余3条评论
5个回答

17

应要求,我把我的回答单独作为一个答案发布了。


这是我如何运用大家的建议。

快速浏览编译错误

将以下内容添加到~/.vimrc文件中:

autocmd Filetype java set makeprg=javac\ %
set errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
map <F9> :make<Return>:copen<Return>
map <F10> :cprevious<Return>
map <F11> :cnext<Return>

按 F9 键进行编译,按 F10/F11 键循环查看错误。


13

如果你在Java类中没有使用任何包,那么

//compile
:!javac %

//run
:!java -cp %:p:h %:t:r

.vimrc文件中将F5键映射为自动化构建。

map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!gcc % -o %<"
exec "!time ./%<"
elseif &filetype == 'cpp'
exec "!g++ % -o %<"
exec "!time ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!time java -cp %:p:h %:t:r"
elseif &filetype == 'sh'
exec "!time bash %"
elseif &filetype == 'python'
exec "!time python2.7 %"
elseif &filetype == 'html'
exec "!firefox % &"
elseif &filetype == 'go'
exec "!go build %<"
exec "!time go run %"
elseif &filetype == 'mkd'
exec "!~/.vim/markdown.pl % > %.html &"
exec "!firefox %.html &"
endif
endfunc

7
这里是用javac编译Java的Vim维基文章。请点击这里查看。

将以下代码添加到您的vimrc文件中,以将F9映射到编译,将F10映射到运行。*(大段代码)* 这才是真正的用户友好啊。但是好吧,如果它能帮助我长期提高效率,我很乐意尝试。 - Pieter
1
@Pieter 你可以在你的vimrc文件中添加以下内容:autocmd Filetype java set makeprg=javac\ %set errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#,然后在你的主类中运行:make - jamapag
只要我的所有代码都在一个文件中,这对我来说是有效的。如果我创建一个名为MyClass.java的文件,并且在Main.java中使用MyClass,我会得到cannot find symbol错误。我看到你的vim规则似乎调用了javac,但它似乎没有生成所需的**.class文件,以便Main.java可以使用MyClass*。 - Pieter

3

使用Makefiles,您可以使用一些非常通用的东西:

JAVAFILES=$(wildcard *.java)

mytarget: $(JAVAFILES)
    javac $^

另一方面,你可能会发现做这件事很好

:compiler javac
:se makeprg=javac\ **/*.java
:make
:copen

将一些键映射到:cnext:cprevious,以快速导航错误。

使用:colder/:cnewer返回早期/较新的快速修复列表。快速修复将记住您在特定快速修复列表中所处的位置。


1
我也更喜欢使用make。如果我没记错的话,Robert Mecklenburg的书《使用GNU make管理项目》中包含了一个关于如何为各种Java项目编写通用Makefile的小节。 - evnu

1
如果您使用Linux(使用bash),这是我的设置: 要编译并运行带有主文件的类,只需在vimrc文件中包含以下内容
nnoremap <leader>ac :cd %:p:h <CR> :! javac %:t<CR> :! java %:t:r<CR>

让我为您介绍一下这段代码的工作原理。当您按下领导键,然后再按下 a 和 c (\ac) 时,代码会更改到 vim 中打开的当前文件的目录(大概是您的主文件)。然后,代码会编译您的文件 yourfile.java (%:t)。最后,代码会运行您的主文件 yourfile (%:t:r)。< CR > 代表回车,相当于按下 enter 键。这种方法也适用于开发具有多个类的项目,因为您可以在上面的代码中添加更多代码以使其编译其他类之前运行主要程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接