我想直接在我的Emacs缓冲区中以漂亮的印刷形式插入已评估的Clojure表达式的结果。
例如,有:
;; [emacs lisp]
(insert (nrepl-dict-get (nrepl-sync-request:eval "(range 30)") "value"))
我得到了感兴趣的缓冲区
;;=>
(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29)
在过去,我让Clojure为我打印漂亮的东西,如下:
(nrepl-dict-get
(nrepl-sync-request:eval
(format "(clojure.core/let [x %s] (with-out-str (clojure.pprint/pprint x)))"
"(range 30)"))
"value")
;;=>
"(0\n 1\n 2\n 3\n 4\n 5\n 6\n 7\n 8\n 9\n 10\n 11\n 12\n 13\n 14\n 15\n 16\n 17\n 18\n 19\n 20\n 21\n 22\n 23\n 24\n 25\n 26\n 27\n 28\n 29)\n"
但是,"
和\n
正在插入转义;我希望它们不被插入。换句话说,我希望直接插入漂亮打印的结果,而不必转义引号或换行符。这曾经用于早期版本的Cider和cider-nrepl
。
答案 0 :(得分:2)
包装:
(nrepl-dict-get
(nrepl-sync-request:eval
(format "(clojure.core/let [x %s] (with-out-str (clojure.pprint/pprint x)))"
"(range 30)"))
"value")
read
中的应解决此问题。
答案 1 :(得分:1)
我刚刚将此功能添加到lispy(这是Paredit风格 使用Cider for Clojure eval的包: 2E 将是一个漂亮的eval-and-insert,而 E 会继续做一个简单的。
以下是一个示例(|
表示点):
|(for [x (range 8)] (range x))
E 之后:
|(for [x (range 8)] (range x))
(() (0) (0 1) (0 1 2) (0 1 2 3) (0 1 2 3 4) (0 1 2 3 4 5) (0 1 2 3 4 5 6))
2E 之后:
|(for [x (range 8)] (range x))
(()
(0)
(0 1)
(0 1 2)
(0 1 2 3)
(0 1 2 3 4)
(0 1 2 3 4 5)
(0 1 2 3 4 5 6))
当然你仍然可以做 EjM 来完成同样的事情:
(for [x (range 8)] (range x))
|(()
(0)
(0 1)
(0 1 2)
(0 1 2 3)
(0 1 2 3 4)
(0 1 2 3 4 5)
(0 1 2 3 4 5 6))