我有各种各样的东西'before-save-hook.例如,我跑'delete-trailing-whitespace.几乎在所有场合都是我想要的.
但有时,我正在处理与其他人共享的文件,并且该文件已经有一堆尾随空格.如果我保存文件,我会得到一个非常令人困惑的大差异,因为我的变化被埋没在数十或数百个毫无意义的变化中.是的,每个人都可以告诉他们的差异工具不显示空白变化,但这是每个人每次看到差异时都要做的事情.我甚至不想改变空白.
有没有我可以做的事情来保存文件没有空格的变化,没有启动没有init.el文件的新的Emacs实例,或init.el没有挂钩的修改?
raf*_*lak 11
我提出的一个更简单的解决方案是我fundamental-mode没有安装钩子,因为我希望它尽可能简单.因此,如果我想保存文件而不运行挂钩,我暂时切换到fundamental-mode.
根据与@Stefan进行的评论讨论,这是两种可能的(未经测试的)解决方案:
用途let:
(defun save-buffer-without-dtw ()
(interactive)
(let ((b (current-buffer))) ; memorize the buffer
(with-temp-buffer ; new temp buffer to bind the global value of before-save-hook
(let ((before-save-hook (remove 'delete-trailing-whitespace before-save-hook)))
(with-current-buffer b ; go back to the current buffer, before-save-hook is now buffer-local
(let ((before-save-hook (remove 'delete-trailing-whitespace before-save-hook)))
(save-buffer)))))))
Run Code Online (Sandbox Code Playgroud)
用途unwind-protect:
(defun save-buffer-without-dtw ()
(interactive)
(let ((restore-global
(memq 'delete-trailing-whitespace (default-value before-save-hook)))
(restore-local
(and (local-variable-p 'before-save-hook)
(memq 'delete-trailing-whitespace before-save-hook))))
(unwind-protect
(progn
(when restore-global
(remove-hook 'before-save-hook 'delete-trailing-whitespace))
(when restore-local
(remove-hook 'before-save-hook 'delete-trailing-whitespace t))
(save-buffer))
(when restore-global
(add-hook 'before-save-hook 'delete-trailing-whitespace))
(when restore-local
(add-hook 'before-save-hook 'delete-trailing-whitespace nil t)))))
Run Code Online (Sandbox Code Playgroud)
第二种解决方案的问题在于,功能的顺序before-save-hook可能会更改。