When working with files changed on disk, there are two warnings

  • ... changed on disk; really edit the buffer?
  • ... has changed since visited or saved. Save anyway?

They're useful, but get very impractical when switching branches fort and back (as I commonly do with git).

Is it possible to make Emacs determine that the content hasn't actually changed (or has been restored to a state equals to what's in its Emacs buffer)?

The fix given in the nearly-duplicate solves the first part only. As @Stefan wrote, the second is easy using (set-visited-file-modtime).

  • possible duplicate emacs.stackexchange.com/questions/21137/… – JeanPierre Aug 25 '16 at 16:28
  • FWIW, I think it'd be good to have such a behavior in Emacs, so I'd welcome a patch to Emacs which does that cleanly. It might be easier to make it work well by patching Emacs than with a hack to ask-user-about-supersession-threat. – Stefan Aug 28 '16 at 22:55
  • @Stefan A patch would be fine, but I'm not good enough in "emacsing" yet. Anyway, I'd suggest to rewrite the 50 line monster called basic-save-buffer first. – maaartinus Aug 28 '16 at 23:41

You might be able to tweak ask-user-about-supersession-threat to just call set-visited-file-modtime when the buffer and the file have the same contents, so that Emacs refreshes its notion of "which was the state of the file when I read it".

Checking "same contents" basically involves saving the buffer into an auxiliary file, and then comparing the two files (or loading the file into a new buffer and comparing the two buffers).

| improve this answer | |

@Stefan's answer solved it, I'm just adding the details. I'm using the following modification of compare-buffer-with-file from the related question:

  (let ((original-buffer (current-buffer))
        (original-size (point-max)))
       (insert-file-contents filename)
       (zerop (compare-buffer-substrings original-buffer 1 original-size
                                        (current-buffer) 1 (point-max))))
     (progn (set-visited-file-modtime) t)))))
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.