В моем файле .emacs есть следующее:
(defun c++-mode-untabify ()
(save-excursion
(goto-char (point-min))
(while (re-search-forward "[ \t]+$" nil t)
(delete-region (match-beginning 0) (match-end 0)))
(goto-char (point-min))
(if (search-forward "\t" nil t)
(untabify (1- (point)) (point-max))))
nil)
(add-hook 'c++-mode-hook
'(lambda ()
(make-local-hook 'write-contents-hooks)
(add-hook 'write-contents-hooks 'c++-mode-untabify)))
В основном отрывается от http://www.jwz.org/doc/tabs-vs-spaces.html. Это приводит к тому, что emacs запускает untabify
в буфере перед сохранением файла C ++.
Проблема в том, что после того, как я загрузил файл C ++, хук untabify
применяется для всех последующих операций записи в файл, даже для буферов других типов файлов. Это означает, что если я открою файл C ++, а затем отредактирую, скажем, текстовый файл с разделителями табуляции, вкладки при сохранении файла закроются.
Я не гуру elisp, но я думаю, что строка (make-local-hook 'write-contents-hooks)
пытается сделать добавление к write-contents-hooks
применимым только к локальному буферу. Однако это не работает, и c++-mode-untabify
находится в write-contents-hooks
для всех буферов.
Я использую EmacsW32 22.0 на Windows XP. Кто-нибудь знает, как заставить write-contents-hooks
изменить локально для определенного буфера или как сбросить его на nil
при переключении на другие буферы, отличные от C ++?