3

一些 Clojure 函数(例如defrecord)的文档字符串很长。在终端窗口中运行 Clojure 时,我希望能够doc通过诸如more(或less) 之类的寻呼机发送有效的输出。如果有人在 Clojure 中编写了寻呼机功能,那么我想我可以将它与以下内容一起使用:

(with-out-str (doc defrecord))

或者,如果有一个标准的 Java 类实现了寻呼机,我可以弄清楚如何将输出发送给它。

或者,如何将输出发送doc到 shell 命令?这不起作用:

(clojure.java.shell/sh "more" :in (with-out-str (doc defrecord))))

[这个话题很难搜索:“more”、“less”和“doc”显然是非常常见的术语,“java pager”之类的页面会讨论如何将文本拆分为用于格式化文档的页面。]

4

2 回答 2

2

您可以为此使用jline。如果您在 jline 上调用setPaginationEnabled, withtrue并使用该方法,它将分页。printColumnsConsoleReader

但是,如果您尝试在标准 Leiningen REPL 上执行此操作,事情会变得更加复杂。当前版本的 Leiningen v2 使用REPL-y,内部使用 jline ,但不使用printColumns,因此忽略了 jline 分页。

但是,您可以通过 REPL-y 的 ConsoleReader in 获取当前的 Leiningen REPL 高度reply.reader.simple-jline/jline-state,并使用它来划分文档字符串。

(defmacro doc2 [x]
  `(let [h# (-> @reply.reader.simple-jline/jline-state :reader (.. getTerminal getHeight) (- 4))
         [s1# s2#] (split-at h# (-> ~x clojure.repl/doc with-out-str clojure.string/split-lines))]
     (doseq [x# s1#] (println x#))
     (doseq [i# (partition-all h# s2#)]
       (println "\n<more>")
       (read-line)
       (doseq [x# i#] (println x#)))))

你会想把这个宏放在你profiles.clj:repl配置文件下。

{:user {:plugins [...]}
 :repl {:repl-options {:init (defmacro doc2 [x] ...)}}}

当您加载 repl 时,这会将doc2宏放在命名空间中。user

于 2013-10-29T20:23:41.163 回答
1
echo "(doc defrecord)" |clj|more 
于 2013-11-12T01:28:39.743 回答