2024年Clojure状态调查!(a>)分享您的想法!

欢迎!请参阅关于页面获取有关该功能的一些更多信息。

+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

编辑

希望有人能为你找到一个好答案。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))))))
by
编辑 by
非常感谢!计时器有点不合常规,但我能够使它工作!我查找了类似 (after! [cider-repl-loaded?] ) 的结构,但没有找到。以下是可工作的代码。想法是启动一个垂直 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
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 缓冲区中调用命令时,将提示你输入要将名称空间切换到的名称。

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