@@ -1090,6 +1090,12 @@ will align the values like this:
10901090 :safe #'booleanp
10911091 :type 'boolean )
10921092
1093+ (defcustom clojure-align-reader-conditionals nil
1094+ " Whether to align reader conditionals, as if they were maps."
1095+ :package-version '(clojure-mode . " 5.10" )
1096+ :safe #'booleanp
1097+ :type 'boolean )
1098+
10931099(defcustom clojure-align-binding-forms
10941100 '(" let" " when-let" " when-some" " if-let" " if-some" " binding" " loop"
10951101 " doseq" " for" " with-open" " with-local-vars" " with-redefs" )
@@ -1104,6 +1110,10 @@ will align the values like this:
11041110 :safe #'listp
11051111 :type '(repeat string))
11061112
1113+ (defvar clojure--beginning-of-reader-conditional-regexp
1114+ " #\\ ?@(\\ |#\\ ?("
1115+ " Regexp denoting the beginning of a reader conditional." )
1116+
11071117(defun clojure--position-for-alignment ()
11081118 " Non-nil if the sexp around point should be automatically aligned.
11091119This function expects to be called immediately after an
@@ -1118,32 +1128,36 @@ For instance, in a map literal point is left immediately before
11181128the first key; while, in a let-binding, point is left inside the
11191129binding vector and immediately before the first binding
11201130construct."
1121- ; ; Are we in a map?
1122- (or (and (eq (char-before ) ?{ )
1123- (not (eq (char-before (1- (point ))) ?\# )))
1124- ; ; Are we in a cond form?
1125- (let* ((fun (car (member (thing-at-point 'symbol ) clojure-align-cond-forms)))
1126- (method (and fun (clojure--get-indent-method fun)))
1127- ; ; The number of special arguments in the cond form is
1128- ; ; the number of sexps we skip before aligning.
1129- (skip (cond ((numberp method) method)
1130- ((null method) 0 )
1131- ((sequencep method) (elt method 0 )))))
1132- (when (and fun (numberp skip))
1133- (clojure-forward-logical-sexp skip)
1134- (comment-forward (point-max ))
1135- fun)) ; Return non-nil (the var name).
1136- ; ; Are we in a let-like form?
1137- (when (member (thing-at-point 'symbol )
1138- clojure-align-binding-forms)
1139- ; ; Position inside the binding vector.
1140- (clojure-forward-logical-sexp)
1141- (backward-sexp )
1142- (when (eq (char-after ) ?\[ )
1143- (forward-char 1 )
1144- (comment-forward (point-max ))
1145- ; ; Return non-nil.
1146- t ))))
1131+ (let ((point (point )))
1132+ ; ; Are we in a map?
1133+ (or (and (eq (char-before ) ?{ )
1134+ (not (eq (char-before (1- point)) ?\# )))
1135+ ; ; Are we in a reader conditional?
1136+ (and clojure-align-reader-conditionals
1137+ (looking-back clojure--beginning-of-reader-conditional-regexp (- (point ) 4 )))
1138+ ; ; Are we in a cond form?
1139+ (let* ((fun (car (member (thing-at-point 'symbol ) clojure-align-cond-forms)))
1140+ (method (and fun (clojure--get-indent-method fun)))
1141+ ; ; The number of special arguments in the cond form is
1142+ ; ; the number of sexps we skip before aligning.
1143+ (skip (cond ((numberp method) method)
1144+ ((null method) 0 )
1145+ ((sequencep method) (elt method 0 )))))
1146+ (when (and fun (numberp skip))
1147+ (clojure-forward-logical-sexp skip)
1148+ (comment-forward (point-max ))
1149+ fun)) ; Return non-nil (the var name).
1150+ ; ; Are we in a let-like form?
1151+ (when (member (thing-at-point 'symbol )
1152+ clojure-align-binding-forms)
1153+ ; ; Position inside the binding vector.
1154+ (clojure-forward-logical-sexp)
1155+ (backward-sexp )
1156+ (when (eq (char-after ) ?\[ )
1157+ (forward-char 1 )
1158+ (comment-forward (point-max ))
1159+ ; ; Return non-nil.
1160+ t )))))
11471161
11481162(defun clojure--find-sexp-to-align (end )
11491163 " Non-nil if there's a sexp ahead to be aligned before END.
@@ -1152,10 +1166,14 @@ Place point as in `clojure--position-for-alignment'."
11521166 (let ((found))
11531167 (while (and (not found)
11541168 (search-forward-regexp
1155- (concat " {\\ |(" (regexp-opt
1156- (append clojure-align-binding-forms
1157- clojure-align-cond-forms)
1158- 'symbols ))
1169+ (concat (when clojure-align-reader-conditionals
1170+ (concat clojure--beginning-of-reader-conditional-regexp
1171+ " \\ |" ))
1172+ " {\\ |("
1173+ (regexp-opt
1174+ (append clojure-align-binding-forms
1175+ clojure-align-cond-forms)
1176+ 'symbols ))
11591177 end 'noerror ))
11601178
11611179 (let ((ppss (syntax-ppss )))
0 commit comments