请在2024年Clojure调查问卷!中分享您的想法。

欢迎!请参阅关于页面获取更多关于此工作方式的信息。

+1
命名空间与变量

我正在使用Emacs/Cider启动clj REPL。我是通过先打开定义新命名空间的文件来做到这一点的。然后我使用cider-jack-in-clj来启动REPL。REPL命名空间是“user”。我只能在REPL中使用完全限定的函数。如果在REPL中输入user=> (ns myns),它会按预期工作并更改命名空间。我希望能够自动化这一过程,以便每次从文件启动REPL时,REPL命名空间也会更改。

或者,只要我能使用非限定函数,我也可以不更改命名空间。

以下是我的文件顶部的示例,core.clj

(ns coresync.core
(:use [tupelo.core])
(:require [clojure.core.async :refer [chan >!! <!!]]))

在代码的Emacs缓冲区中,我能够获取所有非限定函数,但在REPL中,我需要使用

user=> clojure.core.async/chan

我在网上和论坛上搜索过,但尚未解决这个问题。如果这个问题已经有人问过而我错过了,请原谅。

谢谢

2 个答案

0
 ></a> </span> <span class=
编辑了

希望有人能给出一个很好的答案。Clojure的初始化过程是一个充满变数的过程。在这种情况下,至少有4个组件可能被配置以获得良好的结果

  1. 可能有在项目工具如Leiningen中对REPL进行配置的方法。
  2. CIDER启动一个nrepl服务器,并连接到它,也许可以配置nrepl使用不同的默认名称空间。
  3. CIDER本身可能有一个在启动时切换名称空间的选项。
  4. 在Emacs中编写脚本。

在我们等待有人理解这些之前;这里是一个在Emacs钩子中使用CIDER函数的非常丑陋的暴力方法(即,这是为~/.emacs

(add-hook
 'cider-repl-mode-hook
 (lambda ()
   (run-with-timer
    0.5 nil
    (lambda ()
      (cider-switch-to-last-clojure-buffer)
      (cider-repl-set-ns (cider-current-ns))))))
 ></a> </span> <span class=
编辑了
非常感谢!计时器有点笨拙,但我设法让它工作!我寻找类似的结直肠癌结构,但没有找到。以下工作的代码。想法是启动一个垂直REPL,并使其采用.clj文件中的名称空间名称。

(defun run-clojure()
   (interactive)
   (+popup-mode 0)
   (delete-other-windows)
   (setq w1 (selected-window))
   (setq w1name (buffer-name))
   (cider-jack-in-clj nil)
   (set-window-buffer w1 w1name)
   (run-with-timer 5.0 nil 'cider-repl-set-ns (cider-current-ns))))
0
 ></a> </span> <span class=

Cider中,您可以使用cider-repl-set-ns来实现这一点。

M-x cider-repl-set-ns
或者
C-c M-n n

当您在其Clojure文件缓冲区内运行时,它将切换REPL到当前文件的命名空间。

如果您从REPL缓冲区运行它,它将询问您希望切换到哪个命名空间。

其文档说明如下

(cider-repl-set-ns NS)
切换REPL缓冲区的命名空间到NS。
如果从cljc缓冲区调用,将对Clojure和ClojureScript REPL进行操作
如果存在多个REPL的话。如果在一个REPL缓冲区中调用,
命令将提示输入要切换到哪个命名空间。

by
非常感谢!我在#owenRiddy上的帖子展示了包含cider-repl-set-ns使用的代码。尽管手动操作是可行的,但我在没有使用定时器的情况下无法调用它。有人熟悉REPL加载后如何调用此功能吗?是否有可用的emacs *hook*或*after!*?再次感谢。
...