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))))))

编辑了
非常感谢!定时器有点笨拙,但 tôi đã thể thực hiện được! Tôi đã tìm kiếm cấu trúc loại (after! [cider-repl-loaded?] ), nhưng không thể tìm thấy nó. Dưới đây là mã mà hoạt động. Ý tưởng là để khởi chạy một REPL dọc và让它承担文件的namespace。

(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!*?再次感谢。
...