在emacs中,如何在不运行保存挂钩的情况下保存?

zck*_*zck 16 emacs elisp

我有各种各样的东西'before-save-hook.例如,我跑'delete-trailing-whitespace.几乎在所有场合都是我想要的.

但有时,我正在处理与其他人共享的文件,并且该文件已经有一堆尾随空格.如果我保存文件,我会得到一个非常令人困惑的大差异,因为我的变化被埋没在数十或数百个毫无意义的变化中.是的,每个人都可以告诉他们的差异工具不显示空白变化,但这是每个人每次看到差异时都要做的事情.我甚至不想改变空白.

有没有我可以做的事情来保存文件没有空格的变化,没有启动没有init.el文件的新的Emacs实例,或init.el没有挂钩的修改?

小智 12

这是我如何保存,而不会触发delete-trailing-whitespaceC-x C-q C-x C-s C-x C-q:只读,保存,还原只读

  • 绝对是最有用的答案! (4认同)

raf*_*lak 11

我提出的一个更简单的解决方案是我fundamental-mode没有安装钩子,因为我希望它尽可能简单.因此,如果我想保存文件而不运行挂钩,我暂时切换到fundamental-mode.


sds*_*sds 5

根据与@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可能会更改。