Получить красиво напечатанный результат в вычисляемом Cider выражении в 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.


person JohnJ    schedule 25.11.2014    source источник


Ответы (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 должен решить эту проблему.

person Bozhidar Batsov    schedule 25.11.2014

Я только что добавил эту функцию в 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))

После 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))
person abo-abo    schedule 25.11.2014