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投票

修改于

希望有人能为你提供一个好的答案。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,并且让它采用文件.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投票

在 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缓冲区中调用,
该命令将提示输入要切换到的命名空间名称。

非常感谢!我的文章在 #owenRiddy 上展示了包含 cider-repl-set-ns 使用情况的代码。尽管手动运行是可行的,但我无法在没有定时器的情况下调用它。有没有人熟悉在REPL加载后如何调用这个命令?有没有可以使用emacs *hook* 或 *after*?再次感谢。
...