help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Making a non-ASCII space character visible


From: Nick Helm
Subject: Re: Making a non-ASCII space character visible
Date: Mon, 18 Jun 2018 13:40:27 +1200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (darwin)

On Mon, 18 Jun 2018 at 08:28:18 +1200, Will Parsons wrote:

> I sorry if I seem to be a bit dense here, but if
> global-whitespace-mode doesn't enable whitespace-mode globally, what
> is it good for?

> So, adding (whitespace-mode 1) to my ~/.emacs file is useless unless I
> add it to a major-mode hook, and that I have to do that for every
> major-mode I use?  I can't just say "enable whitespace-mode for all
> buffers unless I say otherwise" then?

> I'm afraid I'm completely lost here.

> Apart from how to enable whitespace-mode automatically, I'd like to
> understand how that:
>
> 1) The character u+2007 (8199) has been verified to have been added to
>    whitespace-display-mappings.
>
> 2) Even after running manually M-x whitespace-mode and verifying that
>    the variable whitespace-mode is now set to t, the display of u+2007
>    doesn't change in the current buffer.

Think of whitespace-mode and global-whitespace-mode as two different modes. 

Doing M-x whitespace-mode will show whitespace chars only within the buffer that
was current when when you called the command. Doing the same command a second
time will toggle whitespace-mode off again. When a window shows a buffer that 
has
whitespace-mode active, "ws" (lower case) will appear in the mode-line.

Doing M-x global-whitespace-mode will show whitespace chars in all buffers (with
a few exceptions). Doing the same command a second time will toggle
global-whitespace-mode off again in all buffers. When global-whitespace-mode is
active, "WS" (upper case) shows in all mode-lines as it is active in all
buffers.

The two modes work cooperatively, so you can, for example, turn on
global-whitespace-mode everywhere, then toggle whitespace-mode off to hide
whitespace chars in a particular buffer.

There are also two variables with (confusingly) the same names as the functions
that control the modes, i.e. whitespace-mode and global-whitespace-mode. Ignore
these variables for now, they cannot control the modes, only tell you what state
each mode is in.

When enabling the modes from lisp, it works slightly differently. You need to
call the functions `whitespace-mode' and `global-whitespace-mode' with an
argument to turn the modes on and off. For instance, if global-whitespace-mode
is off and you evaluate this (using C-x C-e):

  (global-whitespace-mode 1)

Emacs will turn the mode on in all buffers. Evaling it again will have no effect
as the mode is already active. To turn it off, you would eval:

  (global-whitespace-mode -1)

Similarly, if you want to turn on whitespace-mode in a particular buffer, you
need to eval the function within the buffer you're interested in. For example,
evaling this in *scratch* will only turn it on in *scratch*:

  (whitespace-mode 1)

This is why adding (whitespace-mode 1) to your ~/.emacs file by itself doesn't
work. Emacs has activated the mode in whatever buffer happened to be current
when it started up, which is unlikely to be a buffer you're interested in. So to
active it automatically everywhere all the time, you would add:

  (global-whitespace-mode 1)

to your ~/.emacs file. Or, if you want to activate it only for specific modes,
you would use a mode hook to turn on whitespace-mode just for buffers that use
that specific mode.

However, because you want to visualise some non-standard characters, before you
turn on either of the whitespace modes, you need to tell Emacs what you want it
to display. That's what the variable whitespace-display-mappings is for. This is
a global variable, it's value is the same regardless of whether you're using
whitespace-mode or global-whitespace-mode.

As you've already worked out, you would change this variable to remap the char
you're interested in, but you need to make sure you set the variable before you
turn the mode on. So you would have something like the following in your
~/.emacs:

  (setq whitespace-display-mappings '((space-mark     32 [183] [46])
                                      (space-mark    160 [164] [95])
                                      (space-mark   8199 [164] [95])
                                      (newline-mark   10 [36 10])
                                      (tab-mark        9 [187 9] [92 9])))
  (global-whitespace-mode 1)

In addition to the defaults, this tells Emacs to map FIGURE SPACE (8199) to
CURRENCY SIGN (164) when either whitespace-mode or global-whitespace-mode is
active. BTW, if you want to visualise the FIGURE SPACEs differently you can
change the 164 in (space-mark 8199 [164] [95]) to the codepoint for whatever
char you like.

That should be all you need to get this working. Normally, you could do all this
through customize, but as pointed out up-thread, this isn't working as expected.
Fortunately, you can do this entirely in your ~/.emacs file with the lines
above, but it might pay to temporarily disable any other settings related to
whitespace in your custom.el and ~/.emacs while you get things working.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]