@@ -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.
26192619When 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