我的 .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中抄袭的。这会导致 emacsuntabify
在保存 C++ 文件之前在缓冲区上运行。
问题是,在我加载了一个 C++ 文件后,该untabify
钩子将应用于所有后续文件写入,即使对于其他文件类型的缓冲区也是如此。这意味着,如果我打开一个 C++ 文件,然后编辑一个制表符分隔的文本文件,则在保存文件时制表符会被破坏。
我不是 elisp 大师,但我认为该(make-local-hook 'write-contents-hooks)
行试图使添加write-contents-hooks
仅适用于本地缓冲区。但是,它不起作用,并且c++-mode-untabify
适用于write-contents-hooks
所有缓冲区。
我在 Windows XP 机器上使用 EmacsW32 22.0。有谁知道如何对write-contents-hooks
特定缓冲区进行本地更改,或者nil
在切换到其他非 C++ 缓冲区时如何将其重置?