Получите довольно распечатанный результат в выражении Cider-based в Emacs
Я хотел бы вставить результат оцененного выражения Clojure прямо в мой буфер Emacs, в печатной форме.
Например, с чем-то вроде:
;; [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
,
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
должен решить это.
Я только что добавил эту функцию в lispy (это пакет в стиле Paredit, который использует Cider для 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))
После 2Е:
|(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))