问题 Emacs中的Scala REPL


我喜欢在Emacs中进行Scala开发,并且不时地使用REPL来测试代码片段或者加载和测试我刚刚编写的一些代码。我正在使用Scala 2.9.1,我注意到当我在终端缓冲区中打开REPL时,事情基本上已被破坏。特别是,我无法从当前行中删除任何字符,并且无法在当前行上向后移动光标。这是非常令人沮丧的,因为任何时候我输入错误的东西,我必须重新开始命令。我想知道是否有其他人在使用Emacs下的Scala REPL时遇到此问题,并且如果有人有潜在的解决方案。


3130
2018-01-20 15:56


起源

你是如何在Emacs中启动REPL的? - leedm777
我用ansi-term打开一个新的缓冲区。然后,在该终端缓冲区中,我通过直接调用“scala”或使用sbt控制台启动REPL。无论哪种方式,这个问题似乎都会发生。 - nomad
你可能有更好的运气打开一个新的缓冲区与shell,并从shell启动scala或sbt。 - leedm777


答案:


我发现 rlwrap (readline包装器)与emacs的ansi-term和scala配合得很好。只需调用“rlwrap scala”,您就可以正常进行bash行编辑以及历史记录。作为奖励,您的历史记录将跨越多次scala调用,因此您不会丢失退出Scala REPL后输入的所有内容。

如果rlwrap不适合你,只需在ansi-term(默认为C-x C-j)中切换到行模式,就可以在行上使用emacs风格的编辑,但是没有像历史和完成这样的shell细节。

已经提到过Ensime了,所以如果你不介意所涉及的设置,我会把它作为一个很好的选择。


8
2018-01-20 17:26



谢谢你的提示。这对我来说似乎很有效。事实上,我喜欢使用Ensime方法的rlwrap方法,因为它给了我一个命令历史。现在,使用rlwrap方法通过Emacs调用REPL的唯一剩余限制是无法使用制表符完成。 - nomad
你是如何通过emacs在REPL中获得标签完成的? - CodeKingPlusPlus


你可以安装 ENSIME 和 按照指示。我不知道你调用REPL的方法,但是从ENSIME调用的REPL工作(它允许向后移动光标并删除符号,我已经检查过)。


7
2018-01-20 17:10



谢谢你的提示。看起来从Ensime调用REPL确实解决了这个问题,但它引入了一些其他问题。特别是,通过Ensime调用的REPL没有命令历史记录,并且似乎无法完成制表符。 - nomad
ENSIME为+1,ENSIME很酷 - Igor Chubin


你可以尝试使用 菊石粉amm。我可以在emacs中确认标签完成工作 ansi-term。这适用于其默认模式(基于stty)或 你可以使用JLine3 同 amm。注意Dotty(暂定Scala 3)repl, dotr,也是基于 amm 并且还有工作标签完成 ansi-term


0
2018-04-13 20:32