21

でいろいろ設定してい'before-save-hookます。たとえば、私は実行し'delete-trailing-whitespaceます。これは、ほとんどすべての場合に私が望むものです。

しかし、他の人と共有しているファイルで作業していて、そのファイルの末尾にすでにたくさんの空白が含まれていることがあります。ファイルを保存すると、私の変更が数十または数百の意味のない変更に埋もれているため、かなり混乱する大きな差分が表示されます。はい、誰もが差分ツールに空白の変更を表示しないように指示することができますが、それは差分を見るたびに誰もがしなければならないことです。空白を変更したくありません。

ファイルなしで Emacs の新しいインスタンスを開始したり、フックを持たないinit.el変更を加えたりする以外に、空白を変更せずにファイルを保存するためにできることはありますか?init.el

4

6 に答える 6

5

@Stefan とのコメント ディスカッションに基づいて、2 つの可能な (テストされていない) 解決策を次に示します。

使用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)))))))

使用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)))))

2 番目のソリューションの問題は、 内の関数の順序before-save-hookが変わる可能性があることです。

于 2013-02-18T22:44:10.173 に答える
4

別の解決策は次のとおりです。

(defvar my-inhibit-dtw nil)
(defun my-delete-trailing-whitespace ()
  (unless my-inhibit-dtw (delete-trailing-whitespace)))
(add-hook 'before-save-hook 'my-delete-trailing-whitespace)

その後

(defun my-inhibit-dtw ()
  (interactive)
  (set (make-local-variable 'my-inhibit-dtw) t))

そのためM-x my-inhibit-dtw RET、空白を削除したくないバッファで行うことができます。

于 2013-02-19T14:08:57.293 に答える
1

必要なことは、 から削除'delete-trailing-whitespacebefore-save-hook、バッファを保存してから追加し直すことです。

このコードはそれを行いますが、最初から存在する場合にのみ削除して追加します。

;; save the buffer, removing and readding the 'delete-trailing-whitespace function
;; to 'before-save-hook if it's there
(defun save-buffer-no-delete-trailing-whitespace ()
  (interactive)
  (let ((normally-should-delete-trailing-whitespace (memq 'delete-trailing-whitespace before-save-hook)))
    (when normally-should-delete-trailing-whitespace
      (remove-hook 'before-save-hook 'delete-trailing-whitespace))
    (save-buffer)
    (when normally-should-delete-trailing-whitespace
      (add-hook 'before-save-hook 'delete-trailing-whitespace))))
(global-set-key (kbd "C-c C-s") 'save-buffer-no-delete-trailing-whitespace)

また(kbd C-c C-s)、便宜上、コマンドを にバインドします。

于 2013-02-16T18:02:39.060 に答える