-(defun -softly-indent-region-and-on (l r &rest _)
- "Indent current defun unobstrusively.
-Like `aggressive-indent-indent-region-and-on', but wrapped in a
-`aggressive-indent--do-softly'."
- (unless (or (run-hook-wrapped
- 'aggressive-indent--internal-dont-indent-if
- #'eval)
- (aggressive-indent--run-user-hooks))
- (ignore-errors
- (cl-letf (((symbol-function 'message) #'ignore))
- (indent-region-and-on l r)))))
-
-(defvar -changed-list-right nil
- "List of right limit of regions changed in the last command loop.")
-
-(defvar -changed-list-left nil
- "List of left limit of regions changed in the last command loop.")
-
-(defun -indent-if-changed ()
+(defun aggressive-indent--softly-indent-region-and-on (l r &rest _)
+ "Indent region between L and R, and a bit more.
+Like `aggressive-indent-indent-region-and-on', but without errors
+or messages."
+ (cl-letf (((symbol-function 'message) #'ignore))
+ (ignore-errors (aggressive-indent-indent-region-and-on l r))))
+
+;;; Tracking changes
+(defvar aggressive-indent--changed-list nil
+ "List of (left right) limit of regions changed in the last command loop.")
+(make-variable-buffer-local 'aggressive-indent--changed-list)
+
+(defvar-local aggressive-indent--balanced-parens t
+ "Non-nil if the current-buffer has balanced parens.")
+
+(defun aggressive-indent--proccess-changed-list-and-indent ()
+ "Indent the regions in `aggressive-indent--changed-list'."
+ (let ((inhibit-modification-hooks t)
+ (inhibit-point-motion-hooks t)
+ (indent-function
+ (if (cl-member-if #'derived-mode-p aggressive-indent-modes-to-prefer-defun)
+ #'aggressive-indent--softly-indent-defun #'aggressive-indent--softly-indent-region-and-on)))
+ ;; Take the 10 most recent changes.
+ (let ((cell (last aggressive-indent--changed-list 10)))
+ (when cell (setcdr cell nil)))
+ ;; (message "----------")
+ (while aggressive-indent--changed-list
+ ;; (message "%S" (car aggressive-indent--changed-list))
+ (apply indent-function (car aggressive-indent--changed-list))
+ (setq aggressive-indent--changed-list
+ (cdr aggressive-indent--changed-list)))))
+
+(defun aggressive-indent--indent-if-changed ()