Homepage: http://github.com/rolandwalker/unicode-whitespace
Author: Roland Walker
Updated:
Teach whitespace-mode about fancy characters
Quickstart
(require 'unicode-whitespace)
(unicode-whitespace-setup 'subdued-faces)
M-x whitespace-mode RET
Explanation
Unicode-whitespace makes the built-in `whitespace-mode' Unicode-aware
in two different ways:
1. Recognizing Unicode whitespace characters in your buffer,
such as "No-Break Space" or "Hair Space".
2. Displaying Unicode characters such as "Paragraph Sign"
(pilcrow) in place of whitespace.
This library also makes some minor adjustments to the default
settings of `whitespace-mode', and exposes character-by-character
display substitution mappings in customize.
To use unicode-whitespace, place the unicode-whitespace.el library
somewhere Emacs can find it, and add the following to your ~/.emacs
file:
(require 'unicode-whitespace)
(unicode-whitespace-setup 'subdued-faces) ; 'subdued-faces is optional
Then invoke `whitespace-mode' as usual.
The display of newlines is changed from the default. Newlines are
not displayed unless one of the following conditions is met:
1. `truncate-lines' is non-nil
2. `word-wrap' is non-nil
3. The major mode of the buffer is listed in
`unicode-whitespace-newline-mark-modes'.
A new `whitespace-style' is provided: 'echo causes the name of the
whitespace character under the point to be displayed in the echo
area. This is not enabled by default.
Two interactive commands are provided to manipulate these settings
when `whitespace-mode' is active:
`unicode-whitespace-toggle-newlines'
`unicode-whitespace-toggle-echo'
See Also
M-x customize-group RET unicode-whitespace RET
M-x customize-group RET whitespace RET
Notes
If the extended characters used to represent whitespace do
not display correctly on your system, install unicode-fonts.el
and/or read the setup tips therein.
Be aware when setting customizable variables for `whitespace-mode'
that unicode-whitespace works by overwriting those same variables.
Unicode-whitespace causes alternative line terminators such as
"Line Separator" to visually break lines so long as
`whitespace-mode' is on. Extra newline characters are not
inserted. This is a visual effect only, which ceases when
`whitespace-mode' is turned off.
Unicode-whitespace turns off the long-line indicators built
into whitespace-mode because of a font-lock bug. To reverse
this, do
(add-to-list 'whitespace-styles 'lines)
or use a separate long-lines detection package.
Compatibility and Requirements
GNU Emacs version 24.4-devel : yes, at the time of writing
GNU Emacs version 24.3 : yes
GNU Emacs version 23.3 : yes
GNU Emacs version 22.3 and lower : no
Requires ucs-utils.el
Uses if present: unicode-fonts.el
Bugs
Gray faces won't look good on a gray background such as that
used by Zenburn color theme. Does Zenburn set background to
light or dark? Provide a way to force faces?
The face for alternative line terminators is often incorrect;
font-lock overrides the settings from unicode-whitespace. This
is because `whitespace-display-char-on' hardcodes \n as the
line terminator.
Calling alternative line terminators 'space-mark is a hack to
make it possible to toggle display of standard newlines
without affecting the alternates. They really should all be
called newline-mark. whitespace.el could be updated to
allow this.
Trailing space that ends with \r or \f sometimes does not get
fontified -- though it usually get picked up after some
typing. This could be because of some assumptions in the
post-command-hook of whitespace.el.
TODO
There should be separate faces for each of these classes, would
need to patch or override whitespace.el
unicode-whitespace-tab-names
unicode-whitespace-tab-set-names
unicode-whitespace-soft-space-names
unicode-whitespace-hard-space-names
unicode-whitespace-pseudo-space-names
unicode-whitespace-standard-line-terminator-names
unicode-whitespace-alternative-line-terminator-names
form feed
There are probably more nonprinting characters to include as
pseudo-spaces by default. A list of glyphless chars could be
gotten from variable `glyphless-char-display'.
Regexps should probably be redone with only \t for certain
things.
A whitespace-cycle command could turn on the mode and cycle
through a few levels of visibility.
Add a test function that dumps an extended example to scratch
buffer.
Consistent marker symbol for thin spaces, and a way to see the
intersection between thin and nonbreaking - maybe nonbreaking
should be a consistent face and thin a consistent symbol.
The tab-visibility bug in whitespace.el could probably be fixed
with an overlay. Also, stipple can show tabs as arrows without
changing display, seen here (http://emacswiki.org/emacs/BlankMode).
However, the stipple face is dependent on frame-char-width/height.
License
Simplified BSD License:
Redistribution and use in source and binary forms, with or
without modification, are permitted provided that the following
conditions are met:
1. Redistributions of source code must retain the above
copyright notice, this list of conditions and the following
disclaimer.
2. Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials
provided with the distribution.
This software is provided by Roland Walker "AS IS" and any express
or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular
purpose are disclaimed. In no event shall Roland Walker or
contributors be liable for any direct, indirect, incidental,
special, exemplary, or consequential damages (including, but not
limited to, procurement of substitute goods or services; loss of
use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict
liability, or tort (including negligence or otherwise) arising in
any way out of the use of this software, even if advised of the
possibility of such damage.
The views and conclusions contained in the software and
documentation are those of the authors and should not be
interpreted as representing official policies, either expressed
or implied, of Roland Walker.