3

一部の Clojure 関数 ( など) の docstringdefrecordはかなり長いです。ターミナル ウィンドウで Clojure を実行する場合、 (または)docなどのページャーを介して の出力を実際に送信できるようにしたいと考えています。誰かが Clojure でページャー関数を作成した場合、次のようなものと一緒に使用できると思います。moreless

(with-out-str (doc defrecord))

または、ページャーを実装する標準の Java クラスがあれば、そこに出力を送信する方法を理解できます。

docまたは、出力をシェルコマンドに送信するにはどうすればよいですか? これは仕事をしません:

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

[このトピックは検索が困難です。「もっと」、「少ない」、「ドキュメント」は明らかに非常に一般的な用語であり、「Java ページャー」などは、ドキュメントをフォーマットするためにテキストを複数のページに分割する方法について説明しているページを表示します。]

4

2 に答える 2

2

これにはjlineを使用できます。を呼び出しsetPaginationEnabled、jline でメソッドtrueを使用すると、ページングされます。printColumnsConsoleReader

しかし、標準の Leiningen REPL でこれを行おうとすると、事態はさらに複雑になります。現在のバージョンの Leiningen v2 は、内部で jline を使用するREPL-yを使用していますが、 を使用していないprintColumnsため、jline のページネーションは無視されます。

ただし、REPL-y の ConsoleReader を介して現在の 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 に答える