Skip to content

Commit

Permalink
Really protect against unwanted indentation after undo
Browse files Browse the repository at this point in the history
When I am undoing changes to a region I really want the changes to be
undone verbatim, that is, I want the buffer's contents to be like they
were before the change that I want to undo occured.  This is the very
definition of undo.

It is probably the rationale for giving undo special treatment in
aggressive-indent--internal-dont-indent-if in the first place.  It
means that the undo command won't immediately cause reindentation.

But it doesn't fix the whole problem, because changes performed by
undo itself are still recorded into aggressive-indent--changed-list
and the very next command, be it a move or an edit somewhere else,
will still cause those regions to be indented.  Among other things,
it's impossible in practice to use `undo' to undo an aggressive indent
of a region.

The proposed fix checks adds a function to the post-command hook to
check for aggressive-indent-protected-commands and clear the change
list if the current command is in that list.  This is safe if those
changes can only have been performed by the command whose
auto-indentation effects we want to prevent.

* aggressive-indent.el (aggressive-indent--keep-track-of-changes):
Check undo-in-progress.

* aggressive-indent.el
(aggressive-indent--internal-dont-indent-if): Remove check of
aggressive-indent-protected-commands and undo-in-progress.
(aggressive-indent--post-command): New helper.
(aggressive-indent-mode): Put aggressive-indent--post-command in
post-command-hook and remove it when exiting minor mode.
  • Loading branch information
joaotavora committed Dec 12, 2019
1 parent c28246b commit 2e82e71
Showing 1 changed file with 13 additions and 5 deletions.
18 changes: 13 additions & 5 deletions aggressive-indent.el
Original file line number Diff line number Diff line change
Expand Up @@ -167,11 +167,9 @@ change."

;;; Preventing indentation
(defconst aggressive-indent--internal-dont-indent-if
'((memq last-command aggressive-indent-protected-commands)
(memq this-command aggressive-indent-protected-current-commands)
'((memq this-command aggressive-indent-protected-current-commands)
(region-active-p)
buffer-read-only
undo-in-progress
(null (buffer-modified-p))
(and (boundp 'smerge-mode) smerge-mode)
(equal (buffer-name) "*ediff-merge*")
Expand Down Expand Up @@ -471,6 +469,15 @@ If BODY finishes, `while-no-input' returns whatever value BODY produced."
(when (timerp aggressive-indent--idle-timer)
(cancel-timer aggressive-indent--idle-timer)))))

(defun aggressive-indent--post-command ()
"Hook run after every command while in `aggressive-indent-mode'.
Clears `aggressive-indent--changed-list' iff the current
command (the one that's now finished) lives in
`aggressive-indent-protected-current-commands'."
(when (memq this-command aggressive-indent-protected-commands)
(setq aggressive-indent--changed-list nil)))

(defun aggressive-indent--keep-track-of-changes (l r &rest _)
"Store the limits (L and R) of each change in the buffer."
(when aggressive-indent-mode
Expand Down Expand Up @@ -509,14 +516,15 @@ If BODY finishes, `while-no-input' returns whatever value BODY produced."
(aggressive-indent--local-electric t))
(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 'before-save-hook #'aggressive-indent--proccess-changed-list-and-indent nil 'local)
(add-hook 'post-command-hook #'aggressive-indent--post-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 'post-command-hook #'aggressive-indent--softly-indent-defun 'local)))
(remove-hook 'post-command-hook #'aggressive-indent--post-command 'local)))

(defun aggressive-indent--local-electric (on)
"Turn variable `electric-indent-mode' on or off locally, as per boolean ON."
Expand Down

0 comments on commit 2e82e71

Please sign in to comment.