From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.devel Subject: Don't complain about changed file when it hasn't changed Date: Sun, 28 Aug 2016 20:29:42 -0400 Message-ID: NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: blaine.gmane.org 1472430420 32057 195.159.176.226 (29 Aug 2016 00:27:00 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Mon, 29 Aug 2016 00:27:00 +0000 (UTC) User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1.50 (gnu/linux) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Aug 29 02:26:57 2016 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1beAPg-0007ta-6h for ged-emacs-devel@m.gmane.org; Mon, 29 Aug 2016 02:26:56 +0200 Original-Received: from localhost ([::1]:41309 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1beAPd-0003xu-MY for ged-emacs-devel@m.gmane.org; Sun, 28 Aug 2016 20:26:53 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:37081) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1beAPY-0003xk-FH for emacs-devel@gnu.org; Sun, 28 Aug 2016 20:26:49 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1beAPS-0005rD-Di for emacs-devel@gnu.org; Sun, 28 Aug 2016 20:26:47 -0400 Original-Received: from chene.dit.umontreal.ca ([132.204.246.20]:60898) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1beAPS-0005qx-8f for emacs-devel@gnu.org; Sun, 28 Aug 2016 20:26:42 -0400 Original-Received: from ceviche.home (lechon.iro.umontreal.ca [132.204.27.242]) by chene.dit.umontreal.ca (8.14.7/8.14.1) with ESMTP id u7T0RJKE002843; Sun, 28 Aug 2016 20:27:19 -0400 Original-Received: by ceviche.home (Postfix, from userid 20848) id 3FC8D66274; Sun, 28 Aug 2016 20:29:42 -0400 (EDT) X-NAI-Spam-Flag: NO X-NAI-Spam-Threshold: 5 X-NAI-Spam-Score: 0 X-NAI-Spam-Rules: 1 Rules triggered RV5780=0 X-NAI-Spam-Version: 2.3.0.9418 : core <5780> : inlines <5148> : streams <1691642> : uri <2276943> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 132.204.246.20 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:206851 Archived-At: The patch below is supposed to change Emacs such that if the file's timestamp has changed, but the contents is still the same, it doesn't prompt the user about a supersession-threat. Any objection? Stefan diff --git a/lisp/userlock.el b/lisp/userlock.el index a0c55fd..9b45ef4 100644 --- a/lisp/userlock.el +++ b/lisp/userlock.el @@ -97,6 +97,20 @@ ask-user-about-lock-help (define-error 'file-supersession nil 'file-error) +(defun userlock--check-content-unchanged (fn) + (save-restriction + (widen) + (let ((buf (current-buffer)) + (start (point-min)) + (end (point-max))) + (when (with-temp-buffer + (insert-file-contents fn) + (= 0 (compare-buffer-substrings + buf start end + (current-buffer) (point-min) (point-max)))) + (set-visited-file-modtime) + 'unchanged)))) + ;;;###autoload (defun ask-user-about-supersession-threat (fn) "Ask a user who is about to modify an obsolete buffer what to do. @@ -106,30 +120,30 @@ ask-user-about-supersession-threat You can rewrite this to use any criterion you like to choose which one to do. The buffer in question is current when this function is called." - (discard-input) - (save-window-excursion - (let ((prompt - (format "%s changed on disk; \ + (unless (userlock--check-content-unchanged fn) + (discard-input) + (save-window-excursion + (let ((prompt + (format "%s changed on disk; \ really edit the buffer? (y, n, r or C-h) " - (file-name-nondirectory fn))) - (choices '(?y ?n ?r ?? ?\C-h)) - answer) - (while (null answer) - (setq answer (read-char-choice prompt choices)) - (cond ((memq answer '(?? ?\C-h)) - (ask-user-about-supersession-help) - (setq answer nil)) - ((eq answer ?r) - ;; Ask for confirmation if buffer modified - (revert-buffer nil (not (buffer-modified-p))) - (signal 'file-supersession - (list "File reverted" fn))) - ((eq answer ?n) - (signal 'file-supersession - (list "File changed on disk" fn))))) - (message - "File on disk now will become a backup file if you save these changes.") - (setq buffer-backed-up nil)))) + (file-name-nondirectory fn)))) + (while + (let ((answer (read-char-choice prompt '(?y ?n ?r ?? ?\C-h)))) + (cond ((memq answer '(?? ?\C-h)) + (ask-user-about-supersession-help) + 'repeat) + ((eq answer ?r) + ;; Ask for confirmation if buffer modified + (revert-buffer nil (not (buffer-modified-p))) + (signal 'file-supersession + (list "File reverted" fn))) + ((eq answer ?n) + (signal 'file-supersession + (list "File changed on disk" fn))) + (t (null answer))))) + (message + "File on disk now will become a backup file if you save these changes.") + (setq buffer-backed-up nil))))) (defun ask-user-about-supersession-help () (with-output-to-temp-buffer "*Help*"