From 3f3add41ef4e6a0b287d4071a6d55102466a0c99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Thu, 22 Nov 2018 21:58:23 +0000 Subject: [PATCH] Be slightly more careful before clearing the changes list * aggressive-indent.el (aggressive-indent--pre-command-change-head): New variable. (aggressive-indent--pre-command): New function. (aggressive-indent-mode): Add aggressive-indent--pre-command to pre-command-hook and remove it when exiting minor mode. --- aggressive-indent.el | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/aggressive-indent.el b/aggressive-indent.el index b53e10e..7980d64 100644 --- a/aggressive-indent.el +++ b/aggressive-indent.el @@ -469,6 +469,16 @@ If BODY finishes, `while-no-input' returns whatever value BODY produced." (when (timerp aggressive-indent--idle-timer) (cancel-timer aggressive-indent--idle-timer))))) +(defvar aggressive-indent--pre-command-change-head nil) + +(defun aggressive-indent--pre-command () + "Hook run before every command while in `aggressive-indent-mode'. + +Save the most recent element of +`aggressive-indent--changed-list'." + (setq aggressive-indent--pre-command-change-head + (car aggressive-indent--changed-list))) + (defun aggressive-indent--post-command () "Hook run after every command while in `aggressive-indent-mode'. @@ -476,7 +486,8 @@ Clears `aggressive-indent--changed-list' iff the current command (the one that's now finished) lives in `aggressive-indent-protected-commands'." (when (memq this-command aggressive-indent-protected-commands) - (setq aggressive-indent--changed-list nil))) + (while (not (eq aggressive-indent--pre-command-change-head + (pop aggressive-indent--changed-list)))))) (defun aggressive-indent--keep-track-of-changes (l r &rest _) "Store the limits (L and R) of each change in the buffer." @@ -517,13 +528,15 @@ command (the one that's now finished) lives in (add-hook 'after-change-functions #'aggressive-indent--keep-track-of-changes nil 'local) (add-hook 'after-revert-hook #'aggressive-indent--clear-change-list nil 'local) (add-hook 'before-save-hook #'aggressive-indent--proccess-changed-list-and-indent nil 'local) - (add-hook 'post-command-hook #'aggressive-indent--post-command nil 'local)) + (add-hook 'post-command-hook #'aggressive-indent--post-command nil 'local) + (add-hook 'pre-command-hook #'aggressive-indent--pre-command nil 'local)) ;; Clean the hooks (when (timerp aggressive-indent--idle-timer) (cancel-timer aggressive-indent--idle-timer)) (remove-hook 'after-change-functions #'aggressive-indent--keep-track-of-changes 'local) (remove-hook 'after-revert-hook #'aggressive-indent--clear-change-list 'local) (remove-hook 'before-save-hook #'aggressive-indent--proccess-changed-list-and-indent 'local) + (remove-hook 'pre-command-hook #'aggressive-indent--pre-command 'local) (remove-hook 'post-command-hook #'aggressive-indent--post-command 'local))) (defun aggressive-indent--local-electric (on)