Emacs: set и toggle show-trailing-whitespace

Два связанных вопроса с использованием emacs 23.3.1 на linux:

Во-первых, почему я не могу установить значение show-trailing-whitespace на t с помощью setq, как показано ниже? Когда я помещаю версию setq в мой .emacs, она не меняет значение (как видно из функциональности и с помощью 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))

Во-вторых, как я могу переключить значение между t и nil? Я думал, что этот ответ был именно тем, что мне нужно, но в этом случае он не работает. Я использовал:

(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))

Когда я нажал M-ow, я получаю сообщение об ошибке Wront type argument: number-or-marker-p, nil. Любые идеи?

Ответ 1

Сначала: как describe-variable сообщает, что show-trailing-whitespace - это буферная переменная. Это означает, что выполнение setq только устанавливает его для текущего буфера и, следовательно, не имеет эффекта, когда выполняется в файле .emacs. Чтобы иметь что-то похожее на то, что вам нужно, используйте setq-default вместо setq. Это будет работать для всех буферов.

Во-вторых: для переключения вы можете использовать setq, если вы хотите переключать буфер на буфер. Ошибка, которую вы получаете, заключается в том, что вы используете =, который должен проверить, являются ли два числа равными. Переключение выполняется более чистым способом, используя not. Как замечание, команда (redraw-display), кажется, ничего не делает.

(defun tf-toggle-show-trailing-whitespace ()
  "Toggle show-trailing-whitespace between t and nil"
  (interactive)
  (setq show-trailing-whitespace (not show-trailing-whitespace)))

Ответ 2

write (eq show-trailing-whitespace nil)

или короче - но наоборот -

(если show-trailing-whitespace