13

Two related questions using emacs 23.3.1 on linux:

First, why can't I set the value of show-trailing-whitespace to t with setq as shown below? When I put the setq version in my .emacs it does not change the value (as seen functionally and by using M-x describe-variable).

(setq show-trailing-whitespace t)  ; Does not change variable value or give error

(custom-set-variables              ; Sets show-trailing-whitespace as expected
 '(show-trailing-whitespace t))

Second, how can I toggle the value between t and nil? I thought that this answer was exactly what I needed, but it doesn't work in this case. I used:

(global-set-key "\M-ow" 'tf-toggle-show-trailing-whitespace)

(defun tf-toggle-show-trailing-whitespace ()
    "Toggle show-trailing-whitespace between t and nil"
    (interactive)
    (setq show-trailing-whitespace (if (= show-trailing-whitespace nil) t nil))
    (redraw-display))

When I hit M-ow I get an error Wront type argument: number-or-marker-p, nil. Any ideas?

Community
  • 1
  • 1
Tom Aldcroft
  • 2,339
  • 1
  • 14
  • 16

3 Answers3

20

First: as the describe-variable tells you show-trailing-whitespace is a buffer variable. This means that doing a setq only sets it for the current buffer and therefore has no effect when done in the .emacs file. To have something similar to what custom do you need to use setq-default instead of setq. This will work for all the buffers.

Second: For toggling you might want to use setq if you want to toggle on a buffer per buffer basis. The error you get is that you use = which is to test if two numbers are equal. A toggling is done in a cleaner fashion by using not. As a side note, the (redraw-display) command does not seem to be doing anything.

(defun tf-toggle-show-trailing-whitespace ()
  "Toggle show-trailing-whitespace between t and nil"
  (interactive)
  (setq show-trailing-whitespace (not show-trailing-whitespace)))
Nicolas Dudebout
  • 9,172
  • 2
  • 34
  • 43
  • 1
    Super, thanks! The only caveat is that the `(redraw-display)` **does** do something useful in my case. If some trailing whitespace is being shown in red and I toggle the setting off, without `(redraw-display)` the highlighted whitespace doesn't turn white until I manually refresh the screen. – Tom Aldcroft Jul 28 '12 at 19:39
0

write (eq show-trailing-whitespace nil)

or shorter --but reversed--

(if show-trailing-whitespace

Andreas Röhler
  • 4,804
  • 14
  • 18
0

For anyone coming here from the future (Emacs 28+): One can set the variable globally with M-x customize-variable followed by show-trailing-whitespace, return, and toggling to on.

pglpm
  • 516
  • 4
  • 14