【问题标题】:Scala REPL in EmacsEmacs 中的 Scala REPL
【发布时间】:2012-02-15 04:19:58
【问题描述】:

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

【问题讨论】:

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

标签: scala emacs read-eval-print-loop


【解决方案1】:

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

如果 rlwrap 对您不起作用,只需在 ansi-term 中切换到行模式(默认为 Cx Cj),您就可以在线使用 emacs 样式的编辑,但没有 shell 的细节,如历史记录和补全.

Ensime 已经被提及,所以如果您不介意所涉及的设置,我将把它作为一个很好的选择。

【讨论】:

  • 感谢您的提示。这对我来说似乎工作得很好。事实上,与 Ensime 方法相比,我更喜欢 rlwrap 方法,因为它为我提供了命令历史记录。目前,通过 Emacs 使用 rlwrap 方法调用 REPL 的唯一剩余限制是无法使用制表符补全。
  • 您是如何通过 emacs 在 REPL 中完成制表符的?
【解决方案2】:

您可以安装ENSIMEfollow instructions。我不知道你调用 REPL 的方式,但是从 ENSIME 调用的 REPL 可以工作(它允许向后移动光标并删除符号,我已经检查过了)。

【讨论】:

  • 感谢您的提示。看起来从 Ensime 调用 REPL 确实解决了这个问题,但它引入了一些其他问题。特别是,通过 Ensime 调用的 REPL 没有命令历史记录,并且似乎无法完成制表符。
  • @nomad:他们使制表符完成工作。见ensime.github.io/editors/emacs/userguide/#code-completion
【解决方案3】:

您可以尝试使用ammonite replamm。我可以在 emacs ansi-term 中确认选项卡完成工作。这适用于其默认模式(基于 stty)或 you can use JLine3amm。请注意,Dotty(暂定 Scala 3)repl dotr 也是基于 amm 并且在 ansi-term 中也有工作制表符完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2011-10-04
    • 2011-05-14
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多