2009-11-13 Carsten Dominik <carsten.dominik@gmail.com>
[bpt/emacs.git] / lisp / ediff-mult.el
index a5a0651..b9ffb37 100644 (file)
@@ -1,16 +1,16 @@
 ;;; ediff-mult.el --- support for multi-file/multi-buffer processing in Ediff
 
 ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-;;   2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;;   2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
 
 ;; Author: Michael Kifer <kifer@cs.stonybrook.edu>
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,9 +18,7 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 ;;; Code:
 
 
+(provide 'ediff-mult)
+
 (defgroup ediff-mult nil
   "Multi-file and multi-buffer processing in Ediff."
   :prefix "ediff-"
 
 ;; compiler pacifier
 (eval-when-compile
-  (let ((load-path (cons (expand-file-name ".") load-path)))
-    (or (featurep 'ediff-init)
-       (load "ediff-init.el" nil t 'nosuffix))
-    (or (featurep 'ediff-util)
-       (load "ediff-util.el" nil t 'nosuffix))
-    ))
+  (require 'ediff-ptch)
+  (require 'ediff))
 ;; end pacifier
 
 (require 'ediff-init)
@@ -206,47 +202,47 @@ Should be a sexp.  For instance (car ediff-filtering-regexp-history) or nil."
 (defvar ediff-session-registry nil)
 
 (defcustom ediff-meta-truncate-filenames t
-  "*If non-nil, truncate long file names in the session group buffers.
+  "If non-nil, truncate long file names in the session group buffers.
 This can be toggled with `ediff-toggle-filename-truncation'."
   :type 'boolean
   :group 'ediff-mult)
 
 (defcustom ediff-meta-mode-hook nil
-  "*Hooks run just after setting up meta mode."
+  "Hooks run just after setting up meta mode."
   :type 'hook
   :group 'ediff-mult)
 
 (defcustom ediff-registry-setup-hook nil
-  "*Hooks run just after the registry control panel is set up."
+  "Hooks run just after the registry control panel is set up."
   :type 'hook
   :group 'ediff-mult)
 
 (defcustom ediff-before-session-group-setup-hooks nil
-  "*Hooks to run before Ediff arranges the window for group-level operations.
+  "Hooks to run before Ediff arranges the window for group-level operations.
 It is used by commands such as `ediff-directories'.
 This hook can be used to save the previous window config, which can be restored
 on `ediff-quit', `ediff-suspend', or `ediff-quit-session-group-hook'."
   :type 'hook
   :group 'ediff-hook)
 (defcustom ediff-after-session-group-setup-hook nil
-  "*Hooks run just after a meta-buffer controlling a session group, such as
+  "Hooks run just after a meta-buffer controlling a session group, such as
 ediff-directories, is run."
   :type 'hook
   :group 'ediff-mult)
 (defcustom ediff-quit-session-group-hook nil
-  "*Hooks run just before exiting a session group."
+  "Hooks run just before exiting a session group."
   :type 'hook
   :group 'ediff-mult)
 (defcustom ediff-show-registry-hook nil
-  "*Hooks run just after the registry buffer is shown."
+  "Hooks run just after the registry buffer is shown."
   :type 'hook
   :group 'ediff-mult)
 (defcustom ediff-show-session-group-hook '(delete-other-windows)
-  "*Hooks run just after a session group buffer is shown."
+  "Hooks run just after a session group buffer is shown."
   :type 'hook
   :group 'ediff-mult)
 (defcustom ediff-meta-buffer-keymap-setup-hook nil
-  "*Hooks run just after setting up the `ediff-meta-buffer-map'.
+  "Hooks run just after setting up the `ediff-meta-buffer-map'.
 This keymap controls key bindings in the meta buffer and is a local variable.
 This means that you can set different bindings for different kinds of meta
 buffers."
@@ -939,10 +935,9 @@ behavior."
       (erase-buffer)
       ;; delete phony overlays that used to represent sessions before the buff
       ;; was redrawn
-      (ediff-cond-compile-for-xemacs-or-emacs
-       (map-extents 'delete-extent)   ; xemacs
-       (mapc 'delete-overlay (overlays-in 1 1))  ; emacs
-       )
+      (if (featurep 'xemacs)
+         (map-extents 'delete-extent)
+       (mapc 'delete-overlay (overlays-in 1 1)))
 
       (setq regexp (ediff-get-group-regexp meta-list)
            merge-autostore-dir
@@ -1047,32 +1042,30 @@ behavior."
 (defun ediff-update-session-marker-in-dir-meta-buffer (session-num)
   (let (buffer-meta-overlays session-info overl buffer-read-only)
     (setq overl
-         (ediff-cond-compile-for-xemacs-or-emacs
-          (map-extents ; xemacs
-           (lambda (ext maparg)
-             (if (and
-                  (ediff-overlay-get ext 'ediff-meta-info)
-                  (eq (ediff-overlay-get ext 'ediff-meta-session-number)
-                      session-num))
-                 ext)))
+         (if (featurep 'xemacs)
+             (map-extents
+              (lambda (ext maparg)
+                (if (and
+                     (ediff-overlay-get ext 'ediff-meta-info)
+                     (eq (ediff-overlay-get ext 'ediff-meta-session-number)
+                         session-num))
+                    ext)))
            ;; Emacs doesn't have map-extents, so try harder
            ;; Splice overlay lists to get all buffer overlays
-          (progn
-            (setq buffer-meta-overlays (overlay-lists)
-                  buffer-meta-overlays (append (car buffer-meta-overlays)
+           (setq buffer-meta-overlays (overlay-lists)
+                 buffer-meta-overlays (append (car buffer-meta-overlays)
                                                (cdr buffer-meta-overlays)))
-            (car
-             (delq nil
-                   (mapcar
-                    (lambda (overl)
-                      (if (and
-                           (ediff-overlay-get overl 'ediff-meta-info)
-                           (eq (ediff-overlay-get
-                                overl 'ediff-meta-session-number)
-                               session-num))
-                          overl))
-                    buffer-meta-overlays))))
-          ))
+           (car
+            (delq nil
+                  (mapcar
+                   (lambda (overl)
+                     (if (and
+                          (ediff-overlay-get overl 'ediff-meta-info)
+                          (eq (ediff-overlay-get
+                               overl 'ediff-meta-session-number)
+                              session-num))
+                         overl))
+                   buffer-meta-overlays)))))
     (or overl
        (error
         "Bug in ediff-update-session-marker-in-dir-meta-buffer: no overlay with given number %S"
@@ -1388,10 +1381,9 @@ Useful commands:
       (erase-buffer)
       ;; delete phony overlays that used to represent sessions before the buff
       ;; was redrawn
-      (ediff-cond-compile-for-xemacs-or-emacs
-       (map-extents 'delete-extent) ; xemacs
-       (mapc 'delete-overlay (overlays-in 1 1)) ; emacs
-       )
+      (if (featurep 'xemacs)
+         (map-extents 'delete-extent)
+       (mapc 'delete-overlay (overlays-in 1 1)))
 
       (insert "This is a registry of all active Ediff sessions.
 
@@ -2213,44 +2205,35 @@ If this is a session registry buffer then just bury it."
   (let (result olist tmp)
     (if (and point (ediff-buffer-live-p buf))
        (ediff-with-current-buffer buf
-         (ediff-cond-compile-for-xemacs-or-emacs
-          (setq result  ; xemacs
-                (if (setq tmp (extent-at point buf 'ediff-meta-info))
-                    (ediff-overlay-get tmp 'ediff-meta-info)))
-          (progn ; emacs
-            (setq olist (overlays-at point))
-            (setq olist
-                  (mapcar (lambda (elt)
-                            (unless (overlay-get elt 'invisible)
-                              (overlay-get elt 'ediff-meta-info)))
-                          olist))
-            (while (and olist (null (car olist)))
-              (setq olist (cdr olist)))
-            (setq result (car olist)))
-          )
-         ))
-    (if result
-       result
-      (if noerror
-         nil
-       (ediff-update-registry)
-       (error "No session info in this line")))))
+         (if (featurep 'xemacs)
+             (setq result
+                   (if (setq tmp (extent-at point buf 'ediff-meta-info))
+                       (ediff-overlay-get tmp 'ediff-meta-info)))
+           (setq olist
+                 (mapcar (lambda (elt)
+                           (unless (overlay-get elt 'invisible)
+                             (overlay-get elt 'ediff-meta-info)))
+                         (overlays-at point)))
+           (while (and olist (null (car olist)))
+             (setq olist (cdr olist)))
+           (setq result (car olist)))))
+    (or result
+       (unless noerror
+         (ediff-update-registry)
+         (error "No session info in this line")))))
 
 
 (defun ediff-get-meta-overlay-at-pos (point)
-  (ediff-cond-compile-for-xemacs-or-emacs
-   (extent-at point (current-buffer) 'ediff-meta-info) ; xemacs
-   ;; emacs
-   (let* ((overl-list (overlays-at point))
-         (overl (car overl-list)))
-     (while (and overl (null (overlay-get overl 'ediff-meta-info)))
-       (setq overl-list (cdr overl-list)
-            overl (car overl-list)))
-     overl)
-   )
-  )
-
-(defsubst ediff-get-session-number-at-pos (point &optional meta-buffer)
+  (if (featurep 'xemacs)
+      (extent-at point (current-buffer) 'ediff-meta-info)
+    (let* ((overl-list (overlays-at point))
+          (overl (car overl-list)))
+      (while (and overl (null (overlay-get overl 'ediff-meta-info)))
+       (setq overl-list (cdr overl-list)
+             overl (car overl-list)))
+      overl)))
+
+(defun ediff-get-session-number-at-pos (point &optional meta-buffer)
   (setq meta-buffer (if (ediff-buffer-live-p meta-buffer)
                        meta-buffer
                      (current-buffer)))
@@ -2264,52 +2247,46 @@ If this is a session registry buffer then just bury it."
   (if (eobp)
       (goto-char (point-min))
     (let ((overl (ediff-get-meta-overlay-at-pos point)))
-      (ediff-cond-compile-for-xemacs-or-emacs
-       (progn ; xemacs
-        (if overl
-            (setq overl (next-extent overl))
-          (setq overl (next-extent (current-buffer))))
-        (if overl
-            (extent-start-position overl)
-          (point-max)))
-       ;; emacs
-       (if overl
-          ;; note: end of current overlay is the beginning of the next one
-          (overlay-end overl)
-        (next-overlay-change point))
-       )
-      )
-    ))
+      (if (featurep 'xemacs)
+         (progn ; xemacs
+           (if overl
+               (setq overl (next-extent overl))
+             (setq overl (next-extent (current-buffer))))
+           (if overl
+               (extent-start-position overl)
+             (point-max)))
+       ;; emacs
+       (if overl
+           ;; note: end of current overlay is the beginning of the next one
+           (overlay-end overl)
+         (next-overlay-change point))))))
 
 
 (defun ediff-previous-meta-overlay-start (point)
   (if (bobp)
       (goto-char (point-max))
     (let ((overl (ediff-get-meta-overlay-at-pos point)))
-      (ediff-cond-compile-for-xemacs-or-emacs
-       (progn
-        (if overl
-            (setq overl (previous-extent overl))
-          (setq overl (previous-extent (current-buffer))))
-        (if overl
-            (extent-start-position overl)
-          (point-min)))
-       (progn
-        (if overl (setq point (overlay-start overl)))
-        ;; to get to the beginning of prev overlay
-        (if (not (bobp))
-            ;; trick to overcome an emacs bug--doesn't always find previous
-            ;; overlay change correctly
-            (setq point (1- point)))
-        (setq point (previous-overlay-change point))
-        ;; If we are not over an overlay after subtracting 1, it means we are
-        ;; in the description area preceding session records.  In this case,
-        ;; goto the top of the registry buffer.
-        (or (car (overlays-at point))
-            (setq point (point-min)))
-        point)
-       )
-      )))
+      (if (featurep 'xemacs)
+         (progn
+           (if overl
+               (setq overl (previous-extent overl))
+             (setq overl (previous-extent (current-buffer))))
+           (if overl
+               (extent-start-position overl)
+             (point-min)))
+       (if overl (setq point (overlay-start overl)))
+       ;; to get to the beginning of prev overlay
+       (if (not (bobp))
+           ;; trick to overcome an emacs bug--doesn't always find previous
+           ;; overlay change correctly
+           (setq point (1- point)))
+       (setq point (previous-overlay-change point))
+       ;; If we are not over an overlay after subtracting 1, it means we are
+       ;; in the description area preceding session records.  In this case,
+       ;; goto the top of the registry buffer.
+       (or (car (overlays-at point))
+           (setq point (point-min)))
+       point))))
 
 ;; this is the action invoked when the user selects a patch from the meta
 ;; buffer.
@@ -2367,10 +2344,10 @@ If this is a session registry buffer then just bury it."
 This is used only for sessions that involve 2 or 3 files at the same time.
 ACTION is an optional argument that can be ?h, ?m, ?=, to mark for hiding, mark
 for operation, or simply indicate which are equal files.  If it is nil, then
-`last-command-char' is used to decide which action to take."
+`last-command-event' is used to decide which action to take."
   (interactive)
   (if (null action)
-      (setq action last-command-char))
+      (setq action last-command-event))
   (let ((list (cdr ediff-meta-list))
        marked1 marked2 marked3
        fileinfo1 fileinfo2 fileinfo3 elt)
@@ -2418,14 +2395,12 @@ for operation, or simply indicate which are equal files.  If it is nil, then
     ))
 
 
-(provide 'ediff-mult)
-
 
-;;; Local Variables:
-;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
-;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)
-;;; eval: (put 'ediff-with-current-buffer 'edebug-form-spec '(form body))
-;;; End:
+;; Local Variables:
+;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
+;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)
+;; eval: (put 'ediff-with-current-buffer 'edebug-form-spec '(form body))
+;; End:
 
-;;; arch-tag: c8a76898-f96f-4d9c-be9d-129134017188
+;; arch-tag: c8a76898-f96f-4d9c-be9d-129134017188
 ;;; ediff-mult.el ends here