How to make M-x undo more fine-grained or sensitive?

Example: say, I wrote:

foo (bar baz) ()

then I M-x undo and receive:

foo (bar

but what I want to get after this undo is:

foo (bar baz)

  • 1
    You can restrict undoing by marking the appropriate part of the buffer before calling undo.
    – user12563
    Commented Jan 22, 2019 at 21:22
  • I'm not sure that what you want is readily possible. Here's a good write up of how the Emacs undo command works: web.archive.org/web/20180518040652/https://www.reddit.com/r/… Also, be wary of undo-tree. It has a bug in it which loses the history (quite frequently in my experience): github.com/emacs-evil/evil/issues/1074 Commented Jan 22, 2019 at 22:24
  • See the emacs documentation for undo. It states that "Consecutive character insertion commands are usually grouped together into a single undo record, to make undoing less tedious." So the behavior depends on what you typed. If you typed baz) () all consecutively, then those would be grouped together and all undone at once. The manual doesn't indicate any way to change that, although perhaps there are packages that will help (I don't know).
    – MTS
    Commented Jan 22, 2019 at 22:24
  • I guess my question is: why do you expect to get foo (bar baz)? What is the sequence of actions you've taken prior to issuing the undo command?
    – MTS
    Commented Jan 22, 2019 at 22:53
  • 1
    @MTS expect -> want
    – jue
    Commented Jan 23, 2019 at 21:26

1 Answer 1


I like to do two things with undo. I turn off the amalgamation stuff (which by doing so permits undo one keystroke at at time); and, I get rid of the timer (because timers affect performance and drive me absolutely bonkers, unless they are idle-timers.

Alternatively, you can modify undo-auto-amalgamate which is hard coded at 20 and set it to a lesser/greater amount.

(when (timerp undo-auto-current-boundary-timer)
  (cancel-timer undo-auto-current-boundary-timer))

(fset 'undo-auto--undoable-change
      (lambda () (add-to-list 'undo-auto--undoably-changed-buffers (current-buffer))))

(fset 'undo-auto-amalgamate 'ignore)
  • This sounds like exactly what I want. Any idea why it wouldn't work with Doom Emacs?
    – gdonald
    Commented Mar 8, 2022 at 1:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.