From mboxrd@z Thu Jan 1 00:00:00 1970 Path: main.gmane.org!not-for-mail From: Mario Lang Newsgroups: gmane.emacs.devel Subject: [PATCH] View Differences before saving Date: Tue, 20 Aug 2002 15:25:15 +0200 Sender: emacs-devel-admin@gnu.org Message-ID: <871y8tzmpw.fsf@lexx.delysid.org> NNTP-Posting-Host: localhost.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: main.gmane.org 1029850014 16577 127.0.0.1 (20 Aug 2002 13:26:54 GMT) X-Complaints-To: usenet@main.gmane.org NNTP-Posting-Date: Tue, 20 Aug 2002 13:26:54 +0000 (UTC) Return-path: Original-Received: from quimby.gnus.org ([80.91.224.244]) by main.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 17h923-0004JB-00 for ; Tue, 20 Aug 2002 15:26:51 +0200 Original-Received: from monty-python.gnu.org ([199.232.76.173]) by quimby.gnus.org with esmtp (Exim 3.12 #1 (Debian)) id 17h9Tz-0003xA-00 for ; Tue, 20 Aug 2002 15:55:43 +0200 Original-Received: from localhost ([127.0.0.1] helo=monty-python.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.10) id 17h939-0001Wl-00; Tue, 20 Aug 2002 09:27:59 -0400 Original-Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 17h90O-0001Vb-00 for emacs-devel@gnu.org; Tue, 20 Aug 2002 09:25:08 -0400 Original-Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 17h90J-0001VB-00 for emacs-devel@gnu.org; Tue, 20 Aug 2002 09:25:07 -0400 Original-Received: from tk212017102236.teleweb.at ([212.17.102.236] helo=lexx.delysid.org) by monty-python.gnu.org with esmtp (Exim 4.10) id 17h90I-0001V2-00 for emacs-devel@gnu.org; Tue, 20 Aug 2002 09:25:02 -0400 Original-Received: from mlang by lexx.delysid.org with local (Exim 3.35 #1 (Debian)) id 17h90W-0005OA-00 for ; Tue, 20 Aug 2002 15:25:16 +0200 Original-To: emacs-devel@gnu.org Original-Lines: 123 User-Agent: Gnus/5.090007 (Oort Gnus v0.07) Emacs/21.2 (i386-debian-linux-gnu) Errors-To: emacs-devel-admin@gnu.org X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Emacs development discussions. List-Unsubscribe: , List-Archive: Xref: main.gmane.org gmane.emacs.devel:6674 X-Report-Spam: http://spam.gmane.org/gmane.emacs.devel:6674 Hello Emacsers :) I've just received the confirmation that my past and future changes assigment arrived at the FSF. So I prepared a slightly improved version of my previos patch (thanks Kim) for submittion. I don't have CVS access, so if the patch looks OK and is accepted that way, I'd like to ask someone with CVS access to install it. Here's the ChangeLog entry: 2002-08-20 Mario Lang * files.el: (diff-buffer-with-file): New function. Intended for save-some-buffers-action-alist, but useful in general. * (save-some-buffers): Removed static data in call to map-y-or-n-p and moved into save-some-buffers-action-alist. * save-some-buffers-action-alist: New variable. Added option `d' using diff-buffer-to-file. And here is the patch: Index: files.el =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/files.el,v retrieving revision 1.601 diff -u -r1.601 files.el --- files.el 15 Aug 2002 20:08:24 -0000 1.601 +++ files.el 20 Aug 2002 13:15:01 -0000 @@ -2992,17 +2992,64 @@ (rename-file (cdr setmodes) buffer-file-name)))))) setmodes)) +(defun diff-buffer-with-file (&optional buffer) + "View the differences between BUFFER and its associated file. +This requires the external program \"diff\" to be in your `exec-path'." + (interactive "bBuffer: ") + (setq buffer (get-buffer (or buffer (current-buffer)))) + (let ((buf-filename (buffer-file-name buffer))) + (unless buf-filename + (error "Buffer %s has no associated file" buffer)) + (let ((diff-buf (get-buffer-create "*Buffer-diff*"))) + (with-current-buffer buffer + (save-restriction + (widen) + (if (zerop + (shell-command-on-region (point-min) (point-max) + (concat "diff " + (when (and (boundp 'ediff-custom-diff-options) + (stringp ediff-custom-diff-options)) + ediff-custom-diff-options) + " " buf-filename " -") diff-buf)) + (message "No differences found") + (progn + (with-current-buffer diff-buf + (goto-char (point-min)) + (if (fboundp 'diff-mode) + (diff-mode) + (fundamental-mode))) + (display-buffer diff-buf)))))) + nil)) + +(defvar save-some-buffers-action-alist + '((?\C-r + (lambda (buf) + (view-buffer buf + (lambda (ignore) + (exit-recursive-edit))) + (recursive-edit) + ;; Return nil to ask about BUF again. + nil) + "display the current buffer") + (?d #'diff-buffer-with-file + "Show difference to last saved version")) + "ACTION-ALIST argument used in call to `map-y-or-n-p'.") + (defun save-some-buffers (&optional arg pred) "Save some modified file-visiting buffers. Asks user about each one. -You can answer `y' to save, `n' not to save, or `C-r' to look at the -buffer in question with `view-buffer' before deciding. +You can answer `y' to save, `n' not to save, `C-r' to look at the +buffer in question with `view-buffer' before deciding or `d' to +view the differences using `diff-buffer-to-file'. Optional argument (the prefix) non-nil means save all with no questions. Optional second argument PRED determines which buffers are considered: If PRED is nil, all the file-visiting buffers are considered. If PRED is t, then certain non-file buffers will also be considered. If PRED is a zero-argument function, it indicates for each buffer whether -to consider it or not when called with that buffer current." +to consider it or not when called with that buffer current. + +See `save-some-buffers-action-alist' if you want to +change the additional actions you can take on files." (interactive "P") (save-window-excursion (let* ((queried nil) @@ -3034,15 +3081,7 @@ (save-buffer))) (buffer-list) '("buffer" "buffers" "save") - (list (list ?\C-r (lambda (buf) - (view-buffer buf - (function - (lambda (ignore) - (exit-recursive-edit)))) - (recursive-edit) - ;; Return nil to ask about BUF again. - nil) - "display the current buffer")))) + save-some-buffers-action-alist)) (abbrevs-done (and save-abbrevs abbrevs-changed (progn -- CYa, Mario