Emacs Tip #3: Whitespace Cleanup
Good developers are very careful about the proper use of whitespace in their files - there should be no empty lines at the beginning of a file, no empty lines at the end of a file, no trailing whitespace, no mixture of tabs and spaces, etc.
Emacs, naturally, wants to help with every problem possible and
provides a very nice solution in the form of the whitespace-cleanup
command. It’s a much more powerful alternative to the older
delete-trailing-whitespace
command, that simply deletes trailing
whitespace, and it’s aware of the whitespace-style
variable, used by whitespace-mode
.
It usually applies to the whole buffer, but in transient mark
mode when the mark is active, it applies to the region. It also
applies to the region when it is not in transient mark mode, the
mark is active and C-u
was pressed just before
calling whitespace-cleanup
interactively. There is also a similar
command called whitespace-cleanup-region
.
The problems cleaned up are (borrowed from the official documentation):
-
Empty lines at beginning of buffer.
-
Empty lines at end of buffer. If
whitespace-style
includes the valueempty
, remove all empty lines at beginning and/or end of buffer. -
8 or more SPACEs at beginning of line. If
whitespace-style
includes the valueindentation
: replace 8 or more SPACEs at beginning of line by TABs, ifindent-tabs-mode
is non-nil; otherwise, replace TABs by SPACEs. Ifwhitespace-style
includes the valueindentation::tab
, replace 8 or more SPACEs at beginning of line by TABs. Ifwhitespace-style
includes the valueindentation::space
, replace TABs by SPACEs. -
SPACEs before TAB. If
whitespace-style
includes the valuespace-before-tab
: replace SPACEs by TABs, ifindent-tabs-mode
is non-nil; otherwise, replace TABs by SPACEs. Ifwhitespace-style
includes the valuespace-before-tab::tab
, replace SPACEs by TABs. Ifwhitespace-style
includes the valuespace-before-tab::space
, replace TABs by SPACEs. -
SPACEs or TABs at end of line. If
whitespace-style
includes the valuetrailing
, remove all SPACEs or TABs at end of line. -
8 or more SPACEs after TAB. If
whitespace-style
includes the valuespace-after-tab
: replace SPACEs by TABs, ifindent-tabs-mode
is non-nil; otherwise, replace TABs by SPACEs. Ifwhitespace-style
includes the valuespace-after-tab::tab
, replace SPACEs by TABs. Ifwhitespace-style
includes the valuespace-after-tab::space
, replace TABs by SPACEs.
It might be a good idea to add whitespace-cleanup
to your
before-save-hook
so that every buffer would be cleaned up before it’s saved:
(add-hook 'before-save-hook 'whitespace-cleanup)