我经常发现自己从 REPL 启动一些长时间运行的进程,然后希望我可以在 REPL 运行时继续使用 REPL 执行其他任务。我可以使用 sleme 为当前线程提供背景或启动新的 REPL 控制线程吗?启动额外的 REPL 缓冲区也可以。
编辑:
嗯,我不知何故设法错过了你问题的 Clojure 标签。如果下面的解决方案适用于Clojure,我会感到非常惊讶,因为您可能知道,不幸的是,Clojure社区(至少对于我们这些使用Clojure和CL的人来说)维护自己的Slime版本。我不会删除答案,因为它可能对搜索此功能的 CL 程序员有所帮助。
除非 Clojure 有类似的解决方案,它允许多个 REPL 在单个套接字上多路复用,否则您可能只需手动启动第二个 Swank 服务器(从*inferior-lisp*
缓冲区)并通过 slime-connect
连接到它作为一种解决方法。(无法测试此 ATM,因为我不久前停止在 Clojure 中使用 Slime。
你试过slime-mrepl
吗?我自己实际上并没有使用过它,但是在CCL/Win/Emacs 24下进行了快速测试。
我是这样测试的:M-x slime
,在 REPL、切换缓冲区M-x slime-new-mrepl
中输入 (sleep 10)
。
请原谅我一个有点陈词滥调和非粘液的特定答案; 从好的方面来说,它将适用于任何 clojure REPL。
当我事先知道我正在从 REPL 启动一个长时间运行的任务时,我会使用 future
开始计算并在取消引用之前与future-done?
进行检查。
这可能无法回答您的问题,但意识到只要(slime-communication-style)
:spawn
,使用 C-x C-e
完成的评估总是生成自己的线程,并且可以与 REPL 线程中发生的任何事情并行运行。 输出(来自println
等)将显示在 REPL 缓冲区中。