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

欢迎!请在关于页面了解更多关于这个网站如何工作的信息。

+1
名称空间和变量

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

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

以下是我文件开头core.clj的一个示例

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

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

user=> clojure.core.async/chan

我在网上以及在这个论坛上搜索过,但未能解决这个问题。如果这个问题已经有人问过而我忽略了,我在此先行致歉。

谢谢

2个答案

0

编辑

希望有人能给出一个满意的答案。Clojure的初始化过程就像一个丛林,有许多移动的部件。在这种情况下,至少有4个组件可以配置以获得良好的效果。

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

在我们等待理解其中的某人时;这里有一个使用CIDER函数在Emacs钩子中进行丑陋的蛮力搜索的方法(即,这适用于~/.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))))))

编辑
非常感谢!定时器有点笨拙,但我能让它工作!我寻找过类似( after! [cider-repl-loaded?] )的结构,但找不到。以下是有效的代码。思路是启动一个垂直REPL,并使其带上来自file.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
by

在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加载后调用它。有人熟悉如何在REPL加载后调用这个函数吗?有没有可以使用的emacs *hook* 或 *after!*?再次感谢。
...