Skip to content

Commit 0ba8c22

Browse files
committed
Allow "M" to multiline vectors
* lispy.el (lispy--multiline-1): Update. * lispy-test.el (lispy-alt-multiline): Add test.
1 parent 338fa76 commit 0ba8c22

File tree

2 files changed

+125
-111
lines changed

2 files changed

+125
-111
lines changed

lispy-test.el

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,9 @@ Insert KEY if there's no command."
952952
(should (string= (lispy-with "|(lispy--multiline-1 '(let let*) t)" "M")
953953
"|(lispy--multiline-1\n '(let\n let*)\n t)"))
954954
(should (string= (lispy-with "|(format\n #(\"error: [h]: first, [j]: next, [k]: prev, [SPC]: rep.\"\n 8 9 (face hydra-face-red)\n 20 21 (face hydra-face-red)\n 31 32 (face hydra-face-red)\n 42 45 (face hydra-face-red)))" "M")
955-
"|(format\n #(\"error: [h]: first, [j]: next, [k]: prev, [SPC]: rep.\"\n 8 9 (face\n hydra-face-red)\n 20 21 (face\n hydra-face-red)\n 31 32 (face\n hydra-face-red)\n 42 45 (face\n hydra-face-red)))"))))
955+
"|(format\n #(\"error: [h]: first, [j]: next, [k]: prev, [SPC]: rep.\"\n 8 9 (face\n hydra-face-red)\n 20 21 (face\n hydra-face-red)\n 31 32 (face\n hydra-face-red)\n 42 45 (face\n hydra-face-red)))"))
956+
(should (string= (lispy-with "[1 2 3 4 5]|" "M")
957+
"[1\n 2\n 3\n 4\n 5]|"))))
956958

957959
(ert-deftest lispy-comment ()
958960
(should (string= (lispy-with "(defun foo ()\n (let (a b c)\n (cond ((s1)\n |(s2)\n (s3)))))" ";")

lispy.el

Lines changed: 122 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -2617,115 +2617,127 @@ Don't insert X when it's already there."
26172617
(defun lispy--multiline-1 (expr &optional quoted)
26182618
"Transform a one-line EXPR into a multi-line.
26192619
When QUOTED is not nil, assume that EXPR is quoted and ignore some rules."
2620-
(if (not (listp expr))
2621-
expr
2622-
(if (and lispy-multiline-threshold
2623-
(< (length (lispy--prin1-to-string
2624-
expr 0 'emacs-lisp-mode))
2625-
lispy-multiline-threshold))
2626-
expr
2627-
(let ((res nil)
2628-
elt)
2629-
(while expr
2630-
(setq elt (pop expr))
2631-
(cond
2632-
((eq elt 'ly-raw)
2633-
(cl-case (car expr)
2634-
(empty
2635-
(setq res '(ly-raw empty)))
2636-
(raw
2637-
(setq res (cons elt expr)))
2638-
(dot
2639-
(setq res (cons elt expr)))
2640-
(newline
2641-
(setq res '(ly-raw newline)))
2642-
(comment
2643-
(setq res (cons elt expr)))
2644-
(string
2645-
(setq res
2646-
`(ly-raw string
2647-
,(replace-regexp-in-string
2648-
"\\(?:[^\\]\\|^\\)\\(\\\\n\\)" "\n" (cadr expr) nil t 1))))
2649-
(t (unless (= (length expr) 2)
2650-
(error "Unexpected expr: %S" expr))
2651-
(unless (null res)
2652-
(error "Stray ly-raw in %S" expr))
2653-
(setq res (list 'ly-raw (car expr)
2654-
(lispy--multiline-1
2655-
(cadr expr)
2656-
(car (memq (car expr) '(quote \` clojure-lambda))))))))
2657-
(setq expr nil))
2658-
((equal elt '(ly-raw dot))
2659-
(when (equal (car res) '(ly-raw newline))
2660-
(pop res))
2661-
(push elt res))
2662-
((equal elt '(ly-raw clojure-comma))
2663-
;; two sexps without newlines, then a comma with a newline
2664-
(when (equal (car res) '(ly-raw newline))
2665-
(pop res))
2666-
(when (equal (cadr res) '(ly-raw newline))
2667-
(setq res
2668-
(cons (car res)
2669-
(cddr res))))
2670-
(push elt res)
2671-
(push '(ly-raw newline) res))
2672-
((and (not quoted) (memq elt lispy--multiline-take-3))
2673-
(push elt res)
2674-
;; name
2675-
(when expr
2676-
(push (pop expr) res))
2677-
;; value
2678-
(when expr
2679-
(if (memq elt lispy--multiline-take-3-arg)
2680-
(push (pop expr) res)
2681-
(push (car (lispy--multiline-1 (list (pop expr)))) res)))
2682-
(push '(ly-raw newline) res))
2683-
((and (not quoted) (memq elt lispy--multiline-take-2))
2684-
(push elt res)
2685-
(when (memq elt lispy--multiline-take-2-arg)
2686-
(push (pop expr) res)
2687-
(push '(ly-raw newline) res)))
2688-
((and (memq elt '(let let*))
2689-
expr
2690-
(listp (car expr))
2691-
(listp (cdar expr)))
2692-
(push elt res)
2693-
(let ((body (pop expr)))
2694-
(push
2695-
(lispy-interleave
2696-
'(ly-raw newline)
2697-
(mapcar
2698-
(lambda (x)
2699-
(if (and (listp x)
2700-
(not (eq (car x) 'ly-raw)))
2701-
(cons (car x)
2702-
(lispy--multiline-1 (cdr x)))
2703-
x))
2704-
body))
2705-
res))
2706-
(push '(ly-raw newline) res))
2707-
((keywordp elt)
2708-
(push elt res))
2709-
((not (listp elt))
2710-
(push elt res)
2711-
(unless (and (numberp elt) (eq quoted 'clojure-lambda))
2712-
(push '(ly-raw newline) res)))
2713-
(t
2714-
(setq elt (lispy--multiline-1 elt))
2715-
(if (equal elt '(ly-raw newline))
2716-
(unless (equal elt (car res))
2717-
(push elt res))
2718-
(push elt res)
2719-
(push '(ly-raw newline) res)))))
2720-
(cond ((equal (car res) 'ly-raw)
2721-
res)
2722-
((equal (car res) '(ly-raw newline))
2723-
(if (and (cdr res)
2724-
(lispy--raw-comment-p (cadr res)))
2725-
(nreverse res)
2726-
(nreverse (cdr res))))
2727-
(t
2728-
(nreverse res)))))))
2620+
(cond ((vectorp expr)
2621+
(apply #'vector
2622+
(lispy--multiline-1
2623+
(mapcar #'identity expr))))
2624+
((not (listp expr))
2625+
expr)
2626+
((and lispy-multiline-threshold
2627+
(< (length (lispy--prin1-to-string
2628+
expr 0 'emacs-lisp-mode))
2629+
lispy-multiline-threshold))
2630+
expr)
2631+
(t
2632+
(let ((res nil)
2633+
elt)
2634+
(while expr
2635+
(setq elt (pop expr))
2636+
(cond
2637+
((eq elt 'ly-raw)
2638+
(cl-case (car expr)
2639+
(empty
2640+
(setq res '(ly-raw empty)))
2641+
(raw
2642+
(setq res (cons elt expr)))
2643+
(dot
2644+
(setq res (cons elt expr)))
2645+
(newline
2646+
(setq res '(ly-raw newline)))
2647+
(comment
2648+
(setq res (cons elt expr)))
2649+
(string
2650+
(setq res
2651+
`(ly-raw string
2652+
,(replace-regexp-in-string
2653+
"\\(?:[^\\]\\|^\\)\\(\\\\n\\)" "\n" (cadr expr) nil t 1))))
2654+
(t (unless (= (length expr) 2)
2655+
(error "Unexpected expr: %S" expr))
2656+
(unless (null res)
2657+
(error "Stray ly-raw in %S" expr))
2658+
(setq res (list 'ly-raw (car expr)
2659+
(lispy--multiline-1
2660+
(cadr expr)
2661+
(car (memq (car expr) '(quote \` clojure-lambda))))))))
2662+
(setq expr nil))
2663+
((vectorp elt)
2664+
(push
2665+
(apply #'vector
2666+
(lispy--multiline-1
2667+
(mapcar #'identity elt)))
2668+
res)
2669+
(push '(ly-raw newline) res))
2670+
((equal elt '(ly-raw dot))
2671+
(when (equal (car res) '(ly-raw newline))
2672+
(pop res))
2673+
(push elt res))
2674+
((equal elt '(ly-raw clojure-comma))
2675+
;; two sexps without newlines, then a comma with a newline
2676+
(when (equal (car res) '(ly-raw newline))
2677+
(pop res))
2678+
(when (equal (cadr res) '(ly-raw newline))
2679+
(setq res
2680+
(cons (car res)
2681+
(cddr res))))
2682+
(push elt res)
2683+
(push '(ly-raw newline) res))
2684+
((and (not quoted) (memq elt lispy--multiline-take-3))
2685+
(push elt res)
2686+
;; name
2687+
(when expr
2688+
(push (pop expr) res))
2689+
;; value
2690+
(when expr
2691+
(if (memq elt lispy--multiline-take-3-arg)
2692+
(push (pop expr) res)
2693+
(push (car (lispy--multiline-1 (list (pop expr)))) res)))
2694+
(push '(ly-raw newline) res))
2695+
((and (not quoted) (memq elt lispy--multiline-take-2))
2696+
(push elt res)
2697+
(when (memq elt lispy--multiline-take-2-arg)
2698+
(push (pop expr) res)
2699+
(push '(ly-raw newline) res)))
2700+
((and (memq elt '(let let*))
2701+
expr
2702+
(listp (car expr))
2703+
(listp (cdar expr)))
2704+
(push elt res)
2705+
(let ((body (pop expr)))
2706+
(push
2707+
(lispy-interleave
2708+
'(ly-raw newline)
2709+
(mapcar
2710+
(lambda (x)
2711+
(if (and (listp x)
2712+
(not (eq (car x) 'ly-raw)))
2713+
(cons (car x)
2714+
(lispy--multiline-1 (cdr x)))
2715+
x))
2716+
body))
2717+
res))
2718+
(push '(ly-raw newline) res))
2719+
((keywordp elt)
2720+
(push elt res))
2721+
((not (listp elt))
2722+
(push elt res)
2723+
(unless (and (numberp elt) (eq quoted 'clojure-lambda))
2724+
(push '(ly-raw newline) res)))
2725+
(t
2726+
(setq elt (lispy--multiline-1 elt))
2727+
(if (equal elt '(ly-raw newline))
2728+
(unless (equal elt (car res))
2729+
(push elt res))
2730+
(push elt res)
2731+
(push '(ly-raw newline) res)))))
2732+
(cond ((equal (car res) 'ly-raw)
2733+
res)
2734+
((equal (car res) '(ly-raw newline))
2735+
(if (and (cdr res)
2736+
(lispy--raw-comment-p (cadr res)))
2737+
(nreverse res)
2738+
(nreverse (cdr res))))
2739+
(t
2740+
(nreverse res)))))))
27292741

27302742
(defun lispy-alt-multiline (&optional silent)
27312743
"Spread current sexp over multiple lines.
@@ -4998,7 +5010,7 @@ Ignore the matches in strings and comments."
49985010
;; ——— #1 —————————————————————
49995011
;; Elisp syntax for circular lists
50005012
(goto-char (point-min))
5001-
(while (re-search-forward "\\(?:^\\|\\s-\\)\\(#[0-9]+\\)" nil t)
5013+
(while (re-search-forward "\\(?:^\\|\\s-\\|\\s(\\)\\(#[0-9]+\\)" nil t)
50025014
(replace-match (format "(ly-raw reference %S)"
50035015
(substring-no-properties
50045016
(match-string 1)))

0 commit comments

Comments
 (0)