break evil undo sequence on line change
Emacs Lisp
Switch branches/tags
Nothing to show
Latest commit 4ae4f91 Sep 18, 2017 Gabriel Lazar Gabriel Lazar Add customizable lighter.
Permalink
Failed to load latest commit information.
.gitignore first commit Aug 19, 2017
README.org Small typo. Aug 19, 2017
evil-nl-break-undo.el Add customizable lighter. Sep 18, 2017

README.org

evil-nl-break-undo

This minor mode does only one thing: it breaks the evil undo sequence when the buffer is changed over a line boundary (i.e. when at least one line is created, or deleted in/from the buffer). It is inspired from the following Vim mapping:

inoremap <silent> <cr> <c-g>u<cr>

… which it also generalizes so that:

  • it doesn’t depend on the actual keys pressed
  • it also handles text removal

Instead of trying to map every possible newline-inserting key that exists in the large world of Emacs modes and users, evil-nl-break-undo follows the buffer changes directly; in this way, it doesn’t matter what key was pressed, or how the user changed the buffer: it could have been with RET, or maybe with M-RET, mapped to one utility command or another (insert a new list item; or continue a comment on the next line; indent; add a paren etc.). The same thing happens when text is removed in insert state: if the text deleted includes a newline character, the current evil-based undo sequence is split.

What does it mean?

It means that, for example, after you write an entire paragraph in insert state, and then you hit u in normal state to undo, changes are undone line by line, instead of the whole paragraph disappearing with one swift stroke.

Intended usage

(add-hook 'text-mode-hook #'evil-nl-break-undo-mode)
(add-hook 'prog-mode-hook #'evil-nl-break-undo-mode)

The mode depends on, and assumes that evil-mode is enabled in the buffer, and that the variable evil-want-fine-undo is nil (this is the default in evil-mode; IIRC, not so in Spacemacs).

Status

This is still experimental, and more of an exercise in emacs lisp: there might be evil-enabled buffers that change their text automatically, or in special ways, without explicit user action. This could therefore trigger evil undo breaks by themselves in that buffer, which may, or may not be meaningful there. It would be best then to have such buffers configured for evil emacs state by default (or any other state different than evil insert state). Not sure though if having this minor mode enabled, and with such a buffer in insert state, would do any harm.

It probably doesn’t deserve to be a whole minor mode for such a small thing; but it’s my first! and anyway, Emacs has too many minor modes already.