如何在REPL中修改之前的行 - Scala,以便修正打字错误并节省时间,而不需要使用上/下箭头输入每一行。

8

有时候在Ubuntu终端输入scala -version命令时可能会发生一些错误,例如下面的示例中,在参数中不小心打成了(l:int)而非(l:Int)。

 scala> class Rectangle (l:int, w: Int){
 | val length = l
 | val length = w
    .
    .
    .
    few more lines but still ... module Rectangle is not defined. Or sometimes enter command given and error shows up.

有没有直接编辑/修改并重新运行代码的方法来纠正打字错误?否则,我需要使用上/下箭头逐行输入,这将浪费很多时间。请指导。

1
我认为在进入:paste模式并粘贴代码内容(可以从终端本身或任何其他来源复制)后,应该可以进行编辑。 - Optimight
1
在REPL中,有:load命令可以加载一些Scala源文件。 - kiritsuku
任何初学Scala或需要评估小代码示例的人都应该安装Scala控制台。有关更多详细信息,请查看Daniel C. Sobral在http://chat.stackoverflow.com/transcript/12284聊天期间提供的指导。 - Optimight
3个回答

4

我不知道是否有更好的解决方案,但在我的情况下,我倾向于使用我通常的文本编辑器编写代码片段,并使用REPL的粘贴模式进行粘贴(您可以通过:paste命令进入粘贴模式)。


我以类似的方式尝试了Libre Office。我遵循的过程是:(1)从终端复制,(2)进行必要的编辑,(3)复制回终端---但有时会为每行创建错误。需要在上述第(2)步中从每行中删除回车事件。这也变得非常耗时,不是一种有效的方法。 - Optimight
1
两个建议:1. 使用更好的工具来编辑代码(vim,emacs,notepad ++,sublimetext,textmate,jedit …)2. 开始在编辑器中编辑您的代码,而不是在REPL中进行。只有在一行代码时才将代码直接输入REPL。 - Nicolas
是的。但是......请记住,大多数情况下,REPL仅用于测试或快速评估。如果您想构建更大的应用程序,最好使用命令行在一些Scala文件中编译/解释您的代码。 - Nicolas
不要切换或使用任何编辑器。您甚至可以在:paste上下文中编写代码。但请使用文本编辑器……Libre Office实际上不是,当您从Libre Office复制时,我希望您的剪贴板被格式化内容(最简单的是字体家族,…)污染。 - Andy Petrella
@Nicolas,你说得对,但我想告诉大家这是可能的。但我真正想做的是解释为什么LibreOffice不是一个好选择(以及REPL发生了什么)。 - Andy Petrella
显示剩余4条评论

2
现在你不能这样做。不过,有一些Scala GUI REPL(可以在这里看到,还有kojo和其他大型的IDE),它们允许进行此类操作。选择其中一个即可。

你参考链接中列出的 ScalaConsole 已经过时了,请尝试使用这个新的 - xiefei
@Daaniel C. Sobral 我刚刚下载了Scala IDE for Eclipse 2.0.1并正在尝试学习它。 - Optimight
@Deaniel C Sobral 我肯定想要最轻量级和最快速的选项。我已经开始学习Scala一周了。我愿意探索所有可能性。请注意,我现在正在与Scala Eclipse IDE作斗争。遇到了一些奇怪的行为,或者是我的知识/逻辑有限,无法操作IDE。 - Optimight
@Optimight,你可以试试ScalaConsole。它很轻便,似乎能够满足你的需求。维基上的链接已经失效了,但是上面的xiefei提供了最新的链接。 - Daniel C. Sobral
@Daniel C. Sobral,我们能聊一下或者我能要你的邮件地址吗? 我需要帮助加快学习Scala。我会非常感激的。 - Optimight
显示剩余3条评论

1

自Scala 2.13.2起,基于JLine 3的REPL支持多行编辑(支持)

JLine 3支持多行编辑、更好的tab补全UI等功能。

使用-Xjline:emacs(默认)或-Xjline:vi配置键绑定;使用-Xjline:off禁用

历史记录文件现在为~/.scala_history_jline3

例如,要尝试使用vim键绑定进行多行编辑,请按以下方式启动REPL

scala -Xjline:vi

然后输入多行定义并按上箭头键。注意它的输出结果。
scala> class Foo {
     |   val x = 42
     | }
class Foo

scala> class Foo {
     |   val x = 42
     | }

代替旧行为

scala> class Foo {
     |   val x = 42
     | }
defined class Foo

scala> }

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