我不熟悉Groovy。我已经习惯了Python和Clojure,我可以在REPL上完成大部分编码工作。我正在尝试用Groovy做同样的事,但我不确定我是否找到了匹配的方法。
Groovy Eclipse插件提供了几种交互模式,但似乎都不适合我。
第一种方式将Groovy脚本加载到Groovy控制台。在我看来,控制台是一个弱编辑器,没有任何Eclipse的便利设施,例如标签完成。有一些很好的内省功能,但它并不像是交互式开发。
第二种方法在Eclipse的控制台选项卡中启动Groovy Shell。所以这给了我想要的REPL,但感觉在Eclipse中运行起来非常笨重。没有标签完成。输入代码后我必须输入“go”我想要评估。
Groovy Eclipse插件没有削减它,但Groovy独立分发的Groovy shell工作得很好。它执行制表符完成(类名除外),并在您输入后立即对代码进行评估。它是记录here的代码。
我深入研究了在Eclipse中运行的REPL与使用 groovysh 脚本从独立分发运行的REPL之间的差异。 Eclipse中的一个是'groovy.ui.InteractiveShell'的实例,而来自 groovysh 脚本的实例是'org.codehaus.groovy的实例。 tools.shell.Main' 的。我在 groovysh 脚本中找到了以下代码
if [ "x$OLDSHELL" != "x" ]; then </br>
startGroovy groovy.ui.InteractiveShell "$@"
else
startGroovy org.codehaus.groovy.tools.shell.Main "$@"
fi
上面的代码和this thread告诉我groovy.ui.InteractiveShell正在消失。
也许有计划在未来将新shell更紧密地集成到Eclipse中?
无论如何,我能够将其破解,以便我可以使用从Eclipse项目中处理代码所需的类路径来调用 groovysh 脚本。现在我可以在REPL愉快地发展。但它很乱,我在Groovy独立发行版中使用jar来启动Groovy,而不是使用我的Eclipse项目。我认为可能有更好的方法。
有没有人找到一个很好的方法来集成从 groovysh 脚本和Eclipse中的项目开始的REPL。或者您是否找到了使用Groovy REPL开发的整体更好的方法?
答案 0 :(得分:2)
没有太多努力将groovysh整合到groovy-eclipse中。主要原因是groovysh使用各种非显示字符来指定颜色,完成和插入符号放置等内容。 Eclipse控制台不处理这些并将它们作为垃圾泄漏出来。此外,当在Eclipse中时,来自Groovy的当前shell实现在Windows上运行得不是很好。与jline库存在一些不兼容性。
如果我们要与groovysh进行一些整合,那将是一项艰巨的任务和大量的重写。我并不反对做这样的事情,但到目前为止还没有人要求这个功能(你是我所知道的第一个)。
在Eclipse中工作时从命令行运行groovysh有什么问题? (这不是一个修辞问题,我真的想知道缺少哪些功能。)这是大多数Groovy开发人员在Eclipse内部工作时使用的技术。
答案 1 :(得分:0)
我找到了一种在Eclipse中使用自定义类路径在ITerm中启动groovysh的好方法。它特定于OSX和ITerm,但您可以修改它以调用不同的shell,具体取决于您如何将字符串传递给shell以执行它。
在Eclipse中设置调用脚本的外部工具。该脚本使用ITerm的applescript命令打开一个新的ITerm窗口并执行传入的命令。
下图中参数框的文字:
“cd $ {project_loc}&amp;&amp; /Users/harishtella/Developer/groovy/groovy-1.8.6/bin/groovysh -cp $ {project_loc} / bin:$ {project_loc} / src:$ {project_loc } / lib中/ *:$ {project_loc} /测试“
定义新的外部工具时,$ {project_loc}变量可用。有关详细信息,请参阅this。
请务必取消选中“公共”标签中的“分配控制台”框
这是“iterm-with-command”脚本的主体
#!/bin/sh
# open a new iterm window and runs all the arguments passed in as a command
# in iterm
osascript <<-eof
tell application "iTerm"
set myterm to (make new terminal)
tell myterm
launch session "Default session"
tell the last session
set name to "console"
write text "$@"
end tell
end tell
end tell
eof