发送Clojure';doc&x27;通过寻呼机输出?

发送Clojure';doc&x27;通过寻呼机输出?,clojure,Clojure,某些Clojure函数(例如,defrecord)的文档字符串相当长。在终端窗口中运行Clojure at时,我希望能够通过寻呼机(如more(或less)发送doc)的输出。如果有人在Clojure中编写了寻呼机函数,那么我想我可以将其与以下内容一起使用: (with-out-str (doc defrecord)) 或者,如果有一个实现寻呼机的标准Java类,我可以找出如何将输出发送到该类 或者,如何将doc的输出发送到shell命令?这不起作用: (clojure.java.shell/

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

(with-out-str (doc defrecord))
或者,如果有一个实现寻呼机的标准Java类,我可以找出如何将输出发送到该类

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

(clojure.java.shell/sh "more" :in (with-out-str (doc defrecord))))
[这个主题很难搜索:“更多”、“更少”和“文档”显然是非常常见的术语,而像“java pager”这样的东西会带来一些页面,讨论如何将文本分解为页面以格式化文档。]

您可以使用它。如果使用
true
调用
setPaginationEnabled
,并使用该方法,则在您的jline上,它将显示第页

但是,如果您试图用标准的Leiningen REPL来实现这一点,事情会变得更加复杂。Leiningen v2的当前版本使用,它在内部使用jline,但不使用
printColumns
,因此忽略jline分页

但是,您可以通过REPL-y的ConsoleReader在
reply.reader.simple jline/jline state
中获取当前Leiningen REPL高度,并使用它对文档字符串进行分区

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

这将在加载repl时将
doc2
宏置于
user
命名空间中。

为什么不编写一个程序来打印文档,然后通过管道将其传送到更多?
echo“(doc defred)”| clj | more
每当您需要一个文档字符串时,都会旋转一个完整的jvm clojure实例extreme@DiegoBasch我们的解决方案还可以。我只是没想到。我在我的道路上保留了clojure的最低版本。在速度更快的机器上,延迟并不突出。在一台速度较慢的机器上,如果我要花所有的时间翻阅文档,那么等待它启动也没那么糟糕。但是像Jared314的jline设置这样的解决方案会更好——尽管我确实希望在lein repl中实现这一点。这里有一个脚本,我将其称为
cloman
:#/bin/sh echo“(文件$1)”| clojure |less@DiegoBasch,如果你把你的评论变成回答,我会接受的。(Jared314的回答也很有帮助。)如果您使用此选项,只需提示一下
reply.reader。简单的jline/jline状态
是特定于实现的,可能会在未来的reply版本中中断。另一个特定于实现(可能会中断)的解决方案如下:
echo "(doc defrecord)" |clj|more 
echo "(doc defrecord)" |clj|more