From: Artur Malabarba Date: Thu, 18 Jun 2015 12:46:33 +0000 (+0100) Subject: Merge commit 'c7e65ca646a7fff43df94bb5f95d9953345ef666' X-Git-Url: https://code.delx.au/gnu-emacs-elpa/commitdiff_plain/951b5e388108af26263a6ab6892391fea976a220?hp=61b8c493c44211bb0d7ee0aab5883f51de129bf9 Merge commit 'c7e65ca646a7fff43df94bb5f95d9953345ef666' --- diff --git a/packages/aggressive-indent/README.md b/packages/aggressive-indent/README.md index b5006f5c6..8873568ec 100644 --- a/packages/aggressive-indent/README.md +++ b/packages/aggressive-indent/README.md @@ -7,7 +7,7 @@ transposing lines, or slurping and barfing sexps, indentation is bound to go wrong. **`aggressive-indent-mode`** is a minor mode that keeps your code **always** -indented. It reindents after every command, making it more reliable +indented. It reindents after every change, making it more reliable than `electric-indent-mode`. ### Demonstration ### diff --git a/packages/aggressive-indent/aggressive-indent.el b/packages/aggressive-indent/aggressive-indent.el index 5d9139680..989ab51fc 100644 --- a/packages/aggressive-indent/aggressive-indent.el +++ b/packages/aggressive-indent/aggressive-indent.el @@ -4,7 +4,7 @@ ;; Author: Artur Malabarba ;; URL: http://github.com/Malabarba/aggressive-indent-mode -;; Version: 1.0.2 +;; Version: 1.1 ;; Package-Requires: ((emacs "24.1") (names "20150125.9") (cl-lib "0.5")) ;; Keywords: indent lisp maint tools ;; Prefix: aggressive-indent @@ -18,7 +18,7 @@ ;; to go wrong. ;; ;; `aggressive-indent-mode' is a minor mode that keeps your code always -;; indented. It reindents after every command, making it more reliable +;; indented. It reindents after every change, making it more reliable ;; than `electric-indent-mode'. ;; ;; ### Instructions ### @@ -217,6 +217,11 @@ change." '(when (boundp 'iedit-mode) (add-to-list 'aggressive-indent--internal-dont-indent-if 'iedit-mode))) +(eval-after-load 'coq + '(add-to-list 'aggressive-indent--internal-dont-indent-if + '(and (derived-mode-p 'coq-mode) + (not (string-match "\\.[[:space:]]*$" + (thing-at-point 'line)))))) (defcustom dont-indent-if '() "List of variables and functions to prevent aggressive indenting. @@ -249,28 +254,34 @@ erroring again." (setq -has-errored t) (message -error-message er)))))) + :autoload -(defun indent-defun () +(defun indent-defun (&optional l r) "Indent current defun. -Throw an error if parentheses are unbalanced." +Throw an error if parentheses are unbalanced. +If L and R are provided, use them for finding the start and end of defun." (interactive) (let ((p (point-marker))) (set-marker-insertion-type p t) (indent-region - (save-excursion (beginning-of-defun 1) (point)) - (save-excursion (end-of-defun 1) (point))) + (save-excursion + (when l (goto-char l)) + (beginning-of-defun 1) (point)) + (save-excursion + (when r (goto-char r)) + (end-of-defun 1) (point))) (goto-char p))) -(defun -softly-indent-defun () +(defun -softly-indent-defun (&optional l r) "Indent current defun unobstrusively. Like `aggressive-indent-indent-defun', but without errors or -messages." +messages. L and R passed to `aggressive-indent-indent-defun'." (unless (or (run-hook-wrapped 'aggressive-indent--internal-dont-indent-if #'eval) (aggressive-indent--run-user-hooks)) (cl-letf (((symbol-function 'message) #'ignore)) - (ignore-errors (indent-defun))))) + (ignore-errors (indent-defun l r))))) :autoload (defun indent-region-and-on (l r) @@ -298,12 +309,19 @@ until nothing more happens." (indent-according-to-mode)) ;; And then we indent each following line until nothing happens. (forward-line 1) - (while (and (null (eobp)) - (/= (progn (skip-chars-forward "[:blank:]\n") - (point)) - (progn (indent-according-to-mode) - (point)))) - (forward-line 1))) + (skip-chars-forward "[:blank:]\n") + (let* ((eod (ignore-errors + (save-excursion (end-of-defun) + (point-marker)))) + (point-limit (if (and eod (< (point) eod)) + eod (point-max-marker)))) + (while (and (null (eobp)) + (< (point) point-limit) + (/= (point) + (progn (indent-according-to-mode) + (point)))) + (forward-line 1) + (skip-chars-forward "[:blank:]\n")))) (goto-char p)))) (defun -softly-indent-region-and-on (l r &rest _) @@ -317,26 +335,26 @@ or messages." (cl-letf (((symbol-function 'message) #'ignore)) (ignore-errors (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.") +(defvar -changed-list nil + "List of (left right) limit of regions changed in the last command loop.") (defun -indent-if-changed () "Indent any region that changed in the last command loop." - (let ((inhibit-modification-hooks t)) - (when -changed-list-left - (-softly-indent-region-and-on - (apply #'min -changed-list-left) - (apply #'max -changed-list-right)) - (setq -changed-list-left nil - -changed-list-right nil)))) + (when -changed-list + (while-no-input + (let ((inhibit-modification-hooks t) + (inhibit-point-motion-hooks t) + (indent-function + (if (cl-member-if #'derived-mode-p modes-to-prefer-defun) + #'-softly-indent-defun + #'-softly-indent-region-and-on))) + (while -changed-list + (apply indent-function (car -changed-list)) + (setq -changed-list (cdr -changed-list))))))) (defun -keep-track-of-changes (l r &rest _) "Store the limits (L and R) of each change in the buffer." - (push l -changed-list-left) - (push r -changed-list-right)) + (push (list l r) -changed-list)) ;;; Minor modes @@ -365,10 +383,9 @@ or messages." (cl-member-if #'derived-mode-p dont-electric-modes)) (-local-electric nil) (-local-electric t)) - (if (cl-member-if #'derived-mode-p modes-to-prefer-defun) - (add-hook 'post-command-hook #'-softly-indent-defun nil 'local) - (add-hook 'after-change-functions #'-keep-track-of-changes nil 'local) - (add-hook 'post-command-hook #'-indent-if-changed nil 'local))) + (add-hook 'after-change-functions #'-keep-track-of-changes nil 'local) + ;; (add-hook 'post-command-hook #'-softly-indent-defun nil 'local) + (add-hook 'post-command-hook #'-indent-if-changed nil 'local)) ;; Clean the hooks (remove-hook 'after-change-functions #'-keep-track-of-changes 'local) (remove-hook 'post-command-hook #'-indent-if-changed 'local)