使用ensime emacs在当前项目中执行sbt运行

使用ensime emacs在当前项目中执行sbt运行,emacs,sbt,ensime,Emacs,Sbt,Ensime,我有一个名为Scala playway的Scala项目,我使用sbt-ensimeConfig和sbt-ensimeConfigProject为Ensime生成了配置 当从项目的缓冲区运行M-x ensime时,我可以在Emacs状态栏中看到ensime已连接:它显示Scala[Scala Playerd] 使用C-C C-b r运行项目时,在主目录中启动一个新的sbt实例,在$home/project中创建一个目录,而不是项目目录,并失败: [info] Loading project def

我有一个名为
Scala playway
的Scala项目,我使用
sbt-ensimeConfig
sbt-ensimeConfigProject
为Ensime生成了配置

当从项目的缓冲区运行
M-x ensime
时,我可以在Emacs状态栏中看到ensime已连接:它显示
Scala[Scala Playerd]

使用
C-C C-b r
运行项目时,在主目录中启动一个新的sbt实例,在
$home/project
中创建一个目录,而不是项目目录,并失败:

[info] Loading project definition from /home/user/project
[info] Set current project to user (in build file:/home/user/)
[info] sbt server started at 127.0.0.1:4766
sbt:user> 
sbt:user> run
[error] java.lang.RuntimeException: No main class detected.
[error]     at scala.sys.package$.error(package.scala:27)
[error]     at sbt.Defaults$.$anonfun$runTask$4(Defaults.scala:1199)
[error]     at scala.Option.getOrElse(Option.scala:121)
[error]     at sbt.Defaults$.$anonfun$runTask$3(Defaults.scala:1199)
[error]     at sbt.Defaults$.$anonfun$runTask$3$adapted(Defaults.scala:1198)
[error]     at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error]     at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:42)
[error]     at sbt.std.Transform$$anon$4.work(System.scala:64)
[error]     at sbt.Execute.$anonfun$submit$2(Execute.scala:257)
[error]     at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
[error]     at sbt.Execute.work(Execute.scala:266)
[error]     at sbt.Execute.$anonfun$submit$1(Execute.scala:257)
[error]     at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:167)
[error]     at sbt.CompletionService$$anon$2.call(CompletionService.scala:32)
[error]     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error]     at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error]     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error]     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[error]     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[error]     at java.lang.Thread.run(Thread.java:748)
[error] (compile:run) No main class detected.
[error] Total time: 0 s, completed Aug 28, 2017 9:10:03 PM
发生了什么事?

短篇小说 删除
~/project
文件夹,然后启动emacs

长话短说 如果您在
$HOME
目录中运行
sbt
,它会在那里创建基本的项目结构,主要是
project
target
目录。然后,如果您打开任何
*。scala
文件,emacs(
sbt mode
)将沿着您的路径查找根项目目录。它会在您的
$HOME
中找到一个。您可以在文档中看到它:

Starting from the current default-directory, find a parent
directory that is an sbt root. An sbt root directory is
identified by the following rules:

   - a directory containing a 'project/build.properties' in it.

   - a directory that contains a file matching one of the patterns
    '*.sbt' or 'project/*.scala' file in it.
当前实现的一个问题是,每个缓冲区只执行一次此过程。如果设置了
sbt:buffer project root
变量,则不会对其进行更新

您可以通过重新启动emacs,或通过对每个打开的缓冲区计算
(setq local sbt:buffer project root nil)
,然后以通常的方式从emacs启动sbt来强制一个新值


如果删除
~/project
并使用
sbt:buffer project root
的错误值从任何缓冲区运行
ensime sbt
,它将在home中启动sbt,从而再次创建
~/project
。同样,最简单的方法是杀死emacs,删除目录,然后再次启动emacs。

正因为如此,我花了3个小时的时间把头撞到最近的墙上。非常感谢。