;;; 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 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
;; 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)
(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."
(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
(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"
(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.
(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)))
(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.
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)
))
-(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