如何在vim中快速编译和运行Scala代码?

9

我正在使用vim学习scala。我在vim中编写了一些scala代码,然后:

:!scalac xxx.scala
:!scala Xxx

有没有什么更简单的方法来运行代码?
7个回答

31

我建议你尝试使用SBT - http://code.google.com/p/simple-build-tool/

你可能需要打开几个shell窗口,在vim和SBT会话之间切换,但总的来说,SBT可以将Scala开发简化到感觉像一个解释语言。以下是一些有用的SBT提示:

在项目目录的shell中运行sbt命令,自动创建项目结构。要快速开始,请编辑名为src/main/scala/MyFile.scala的文件。

在一个sbt shell中,运行~compile以连续检测并编译您所做的更改。

在另一个sbt shell中,运行'console'。这会给您一个普通的Scala REPL,并将您的项目及其依赖项已经添加到CLASSPATH中。

从Scala shell中,您可以运行:load加载Scala文件并运行它。或者您可以直接导入和实例化类,并调用在您的Scala代码中定义的函数以测试功能。当您对文件进行更改时,在REPL中输入:replay将重新加载这些更改并重新运行所有输入的命令。

这种设置在与Scalatra一起进行快速Web开发方面非常出色。通过sbt,您可以直接使用“jetty-run”部署和运行您的webapp,然后使用~prepare-webapp自动检测、重新编译和部署更改。然后,您只需保持浏览器打开,并在进行更改时查看更改。这里有一个不错的入门指南:http://blog.everythings-beta.com/?p=430,您可以在大约5分钟内运行Web应用程序。


8
我建议您使用sbt在一个shell中运行程序,并在vim中修改scala文件。 您需要在项目文件中指定一个mainClass方法。详情请参见这里
$ sbt
> ~ run
1. Waiting for source changes... (press enter to interrupt)

当您在vim会话中保存scala文件时,sbt将尝试调用您的mainClass。


7

你最好使用一个构建管理器。但是,在某些情况下,这很有用,特别是如果您只想在Scala解释器中运行单个文件。在vim中,%匹配当前文件。如果您想使用Scala解释器中的当前文件运行文件,则可以运行:

:!scala %

如果你需要经常这样做,可以考虑将此命令映射到快捷键。

map <F5> :!scala %<CR>

如果你想使这个绑定只在scala文件中可用,请尝试以下方法。 这可能需要你拥有scala vim语法文件

au FileType scala map <F5> :!scala %

同样地,要编译文件,您可以运行以下命令。
:!scalac %

如果你想运行已编译好的类,会更加困难,因为你需要知道classpath。使用%:r可能是一个起点--它是当前文件名减去扩展名。
比上面更高级的解决方案是在vim中使用scala解释器/编译器作为构建系统,使用:make。这样你可以通过快速修复功能在vim中导航错误。你会发现我写的一些编译器文件很有帮助。你可以将其复制到~/.vim/compiler/中,然后在vim中设置编译器(:compiler scalai)。
你可能会发现我写的博客文章有用,因为它涵盖了在vim中开发scala的好方法。它介绍了一种将scala与连续编译结合在一个构建管理器中的好方法。

3

地图在这里很有帮助。 我对scala一无所知,但例如命令

:nmap <F6> :!echo test<CR>

每当您在正常模式下按下F6时,将调用shell命令echo test

我相信您可以根据自己的需求进行调整。 如果您希望它是永久性的,请放入.vimrc中(您可能确实需要)。 如果您对整个编辑器脚本编写感兴趣,则可以在此处找到更多信息:http://www.ibm.com/developerworks/linux/library/l-vim-script-1/index.html

P.S. 忘记提到%字符会扩展为shell命令中的当前文件。 您可能想要类似于:! scala %<CR>的内容


编辑:

这是一个比我一开始以为的更复杂的问题(我习惯于使用解释性语言,在那里编译和运行是一个单一的命令)。无论如何,如果你真的还想要单按键编译和运行功能,请尝试这个快速脚本(将其放在.vimrc文件中的某个位置并重新启动vim):

function! CompileAndRunScala()
    w "save current file
    let l:compiler_output = system('scalac ' . expand('%:p'))
    " Runs scalac on current filename (absolute path)
    if v:shell_error "Gets last shell error code (0 means okay, anything else is error)
        echo 'Compile errors!'
        echo l:compiler_output
    else
        echo system('scala ' . expand('%:r'))
        " Runs scala on current file name with extension stripped (also absolute path)
    endif
endfunction
nmap <F6> :call CompileAndRunScala()<CR>

@Freewind,当与vim的:make命令集成时,这会更容易且更强大-请参阅我的帖子。 - schmmd

1

我自己从来没有离开过make,所以我可以用:make °target°编译程序。简单明了。


0

已经安装了SBT后,考虑在Vim编辑器会话中执行以下操作:

:!sbt run

此外,对于编译或打包,
:!sbt compile
:!sbt package

0

你可以通过编写脚本将其缩短为一行代码?

因此,在相同的目录下,你可以执行以下操作:

scalac xxx.scala scala xxx

然后在vim中执行:

:!./scriptName

请确保先使用 chmod 命令将其变为可执行文件


希望能更简单一些,比如我按下 F6,当前文件的代码被编译并运行。无论文件名是什么。 - Freewind
1
我一直认为这就是IDE的用途。我相信你可以找到一个IDE并配置“编译和运行”按钮来启动scalac和scala。 - Realn0whereman
Eclipse有一个Scala插件,但是它非常慢。但是如果我不使用Scala插件在Eclipse中运行Scala,那会让我感到很奇怪:( - Freewind

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