To install this package, run in Emacs:
M-x package-install RET ws-butler RET
Only lines touched get trimmed. If the white space at end of buffer is
changed, then blank lines at the end of buffer are truncated respecting
Trimming only happens when saving.
The user is not made explicitly aware when trimming happens. You keep working and the butler takes care of whitespace for you.
This means if point is at a location that was trimmed, point is not moved, but the data on disk has been cleaned up (revert the buffer to confirm).
By default, ws-butler preserves "virtual spaces" in front of point if necessary. The file on disk is cleaned up however.
This can be disabled with
There might be lines you don't want to get trimmed, e.g. spaces in multiline strings. The behavior can be customized through
ws-butler-trim-predicate. This variable should hold a function that expects 2 arguments (region beginning and end) and should return true only for regions that one wants to get trimmed. As an example
(lambda (beg end)
(not (eq 'font-lock-string-face
(get-text-property end 'face)))))
apt-get install elpa-ws-butler
To use ws-butler, require it and add ws-butler-mode as a hook on any mode where you would like it to be enabled. For example, to enable for all programming language modes, add this to your .emacs:
(add-hook 'prog-mode-hook #'ws-butler-mode)
Alternatively, you can use ws-butler-global-mode to turn it on everywhere.
I started by trimming all spaces at EOL in source code in a "write-file-hook" when I started programming. It seemed like a great idea.
Then I got a job working on a code base where no one else trimmed spaces, so my commits became super noisy. I wanted to stop being the "white space" police, so switched to ws-trim.
post-command-hook and trims white space while you
I started experimenting with using
highlight-changes-mode to trim only
lines I touch on save.
Now, the dependency on
highlight-changes-mode has been removed and we
handle change changing through text properties ourselves.