X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/6980983d9ace0c6bad61e935cfe62ba81baffd0b..ea6c930a8dd83a4e7d7a640c02e8a791458178c0:/lisp/ediff-init.el diff --git a/lisp/ediff-init.el b/lisp/ediff-init.el index b46562b5fd..2dc021380d 100644 --- a/lisp/ediff-init.el +++ b/lisp/ediff-init.el @@ -1,16 +1,16 @@ ;;; ediff-init.el --- Macros, variables, and defsubsts used by Ediff ;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -;; 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +;; 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. ;; Author: Michael Kifer ;; 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 . ;;; Commentary: @@ -29,7 +27,6 @@ ;; Start compiler pacifier (defvar ediff-metajob-name) (defvar ediff-meta-buffer) -(defvar pm-color-alist) (defvar ediff-grab-mouse) (defvar ediff-mouse-pixel-position) (defvar ediff-mouse-pixel-threshold) @@ -39,15 +36,6 @@ (defvar mswindowsx-bitmap-file-path) ;; end pacifier -;; This is used to avoid compilation warnings. When emacs/xemacs forms can -;; generate compile time warnings, we use this macro. -;; In this case, the macro will expand into the form that is appropriate to the -;; compiler at hand. -;; Suggested by rms. -(defmacro ediff-cond-compile-for-xemacs-or-emacs (xemacs-form emacs-form) - (if (featurep 'xemacs) - xemacs-form emacs-form)) - (defvar ediff-force-faces nil "If t, Ediff will think that it is running on a display that supports faces. This is provided as a temporary relief for users of face-capable displays @@ -55,10 +43,9 @@ that Ediff doesn't know about.") ;; Are we running as a window application or on a TTY? (defsubst ediff-device-type () - (ediff-cond-compile-for-xemacs-or-emacs - (device-type (selected-device)) ; xemacs form - window-system ; emacs form - )) + (if (featurep 'xemacs) + (device-type (selected-device)) + window-system)) ;; in XEmacs: device-type is tty on tty and stream in batch. (defun ediff-window-display-p () @@ -75,18 +62,13 @@ that Ediff doesn't know about.") ;; toolbar support for emacs hasn't been implemented in ediff (defun ediff-has-toolbar-support-p () - (ediff-cond-compile-for-xemacs-or-emacs - (and (featurep 'toolbar) (console-on-window-system-p)) ; xemacs form - nil ; emacs form - )) + (if (featurep 'xemacs) + (if (featurep 'toolbar) (console-on-window-system-p)))) (defun ediff-has-gutter-support-p () - (ediff-cond-compile-for-xemacs-or-emacs - (and (featurep 'gutter) (console-on-window-system-p)) ; xemacs form - nil ; emacs form - )) - + (if (featurep 'xemacs) + (if (featurep 'gutter) (console-on-window-system-p)))) (defun ediff-use-toolbar-p () (and (ediff-has-toolbar-support-p) ;Can it do it ? @@ -737,70 +719,60 @@ appropriate symbol: `rcs', `pcl-cvs', or `generic-sc' if you so desire." (defcustom ediff-coding-system-for-read 'raw-text "*The coding system for read to use when running the diff program as a subprocess. -In most cases, the default will do. However, under certain circumstances in -Windows NT/98/95 you might need to use something like 'raw-text-dos here. +In most cases, the default will do. However, under certain circumstances in +MS-Windows you might need to use something like 'raw-text-dos here. So, if the output that your diff program sends to Emacs contains extra ^M's, you might need to experiment here, if the default or 'raw-text-dos doesn't work." :type 'symbol :group 'ediff) -(defcustom ediff-coding-system-for-write 'no-conversion +(defcustom ediff-coding-system-for-write 'emacs-internal "*The coding system for write to use when writing out difference regions -to temp files when Ediff needs to find fine differences." +to temp files in buffer jobs and when Ediff needs to find fine differences." :type 'symbol :group 'ediff) -(ediff-cond-compile-for-xemacs-or-emacs - (progn ; xemacs - (defalias 'ediff-read-event 'next-command-event) - (defalias 'ediff-overlayp 'extentp) - (defalias 'ediff-make-overlay 'make-extent) - (defalias 'ediff-delete-overlay 'delete-extent)) - (progn ; emacs - (defalias 'ediff-read-event 'read-event) - (defalias 'ediff-overlayp 'overlayp) - (defalias 'ediff-make-overlay 'make-overlay) - (defalias 'ediff-delete-overlay 'delete-overlay)) - ) - -;; Check the current version against the major and minor version numbers -;; using op: cur-vers op major.minor If emacs-major-version or -;; emacs-minor-version are not defined, we assume that the current version -;; is hopelessly outdated. We assume that emacs-major-version and -;; emacs-minor-version are defined. Otherwise, for Emacs/XEmacs 19, if the -;; current minor version is < 10 (xemacs) or < 23 (emacs) the return value -;; will be nil (when op is =, >, or >=) and t (when op is <, <=), which may be -;; incorrect. However, this gives correct result in our cases, since we are -;; testing for sufficiently high Emacs versions. -(defun ediff-check-version (op major minor &optional type-of-emacs) - (if (and (boundp 'emacs-major-version) (boundp 'emacs-minor-version)) - (and (cond ((eq type-of-emacs 'xemacs) (featurep 'xemacs)) - ((eq type-of-emacs 'emacs) (featurep 'emacs)) - (t t)) - (cond ((eq op '=) (and (= emacs-minor-version minor) - (= emacs-major-version major))) - ((memq op '(> >= < <=)) - (and (or (funcall op emacs-major-version major) - (= emacs-major-version major)) - (if (= emacs-major-version major) - (funcall op emacs-minor-version minor) - t))) - (t - (error "%S: Invalid op in ediff-check-version" op)))) - (cond ((memq op '(= > >=)) nil) - ((memq op '(< <=)) t)))) +(defalias 'ediff-read-event + (if (featurep 'xemacs) 'next-command-event 'read-event)) +(defalias 'ediff-overlayp + (if (featurep 'xemacs) 'extentp 'overlayp)) + +(defalias 'ediff-make-overlay + (if (featurep 'xemacs) 'make-extent 'make-overlay)) + +(defalias 'ediff-delete-overlay + (if (featurep 'xemacs) 'delete-extent 'delete-overlay)) + +;; Assumes that emacs-major-version and emacs-minor-version are defined. +(defun ediff-check-version (op major minor &optional type-of-emacs) + "Check the current version against MAJOR and MINOR version numbers. +The comparison uses operator OP, which may be any of: =, >, >=, <, <=. +TYPE-OF-EMACS is either 'xemacs or 'emacs." + (and (cond ((eq type-of-emacs 'xemacs) (featurep 'xemacs)) + ((eq type-of-emacs 'emacs) (featurep 'emacs)) + (t)) + (cond ((eq op '=) (and (= emacs-minor-version minor) + (= emacs-major-version major))) + ((memq op '(> >= < <=)) + (and (or (funcall op emacs-major-version major) + (= emacs-major-version major)) + (if (= emacs-major-version major) + (funcall op emacs-minor-version minor) + t))) + (t + (error "%S: Invalid op in ediff-check-version" op))))) + +;; ediff-check-version seems to be totally unused anyway. +(make-obsolete 'ediff-check-version 'version< "23.1") (defun ediff-color-display-p () (condition-case nil - (ediff-cond-compile-for-xemacs-or-emacs - (eq (device-class (selected-device)) 'color) ; xemacs form - (if (fboundp 'display-color-p) ; emacs form - (display-color-p) - (x-display-color-p)) - ) + (if (featurep 'xemacs) + (eq (device-class (selected-device)) 'color) ; xemacs form + (display-color-p)) ; emacs form (error nil))) @@ -813,32 +785,28 @@ to temp files when Ediff needs to find fine differences." (if (ediff-has-face-support-p) - (ediff-cond-compile-for-xemacs-or-emacs - (progn ; xemacs - (defalias 'ediff-valid-color-p 'valid-color-name-p) - (defalias 'ediff-get-face 'get-face)) - (progn ; emacs - (defalias 'ediff-valid-color-p (if (fboundp 'color-defined-p) - 'color-defined-p - 'x-color-defined-p)) - (defalias 'ediff-get-face 'internal-get-face)) - )) + (if (featurep 'xemacs) + (progn + (defalias 'ediff-valid-color-p 'valid-color-name-p) + (defalias 'ediff-get-face 'get-face)) + (defalias 'ediff-valid-color-p (if (fboundp 'color-defined-p) + 'color-defined-p + 'x-color-defined-p)) + (defalias 'ediff-get-face 'internal-get-face))) (if (ediff-window-display-p) - (ediff-cond-compile-for-xemacs-or-emacs - (progn ; xemacs - (defalias 'ediff-display-pixel-width 'device-pixel-width) - (defalias 'ediff-display-pixel-height 'device-pixel-height)) - (progn ; emacs - (defalias 'ediff-display-pixel-width - (if (fboundp 'display-pixel-width) - 'display-pixel-width - 'x-display-pixel-width)) - (defalias 'ediff-display-pixel-height - (if (fboundp 'display-pixel-height) - 'display-pixel-height - 'x-display-pixel-height))) - )) + (if (featurep 'xemacs) + (progn + (defalias 'ediff-display-pixel-width 'device-pixel-width) + (defalias 'ediff-display-pixel-height 'device-pixel-height)) + (defalias 'ediff-display-pixel-width + (if (fboundp 'display-pixel-width) + 'display-pixel-width + 'x-display-pixel-width)) + (defalias 'ediff-display-pixel-height + (if (fboundp 'display-pixel-height) + 'display-pixel-height + 'x-display-pixel-height)))) ;; A-list of current-diff-overlay symbols associated with buf types (defconst ediff-current-diff-overlay-alist @@ -920,10 +888,10 @@ this variable represents.") (ediff-hide-face ediff-current-diff-face-A) ;; Until custom.el for XEmacs starts supporting :inverse-video we do this. ;; This means that some user customization may be trashed. -(if (and (featurep 'xemacs) - (ediff-has-face-support-p) - (not (ediff-color-display-p))) - (copy-face 'modeline ediff-current-diff-face-A)) +(and (featurep 'xemacs) + (ediff-has-face-support-p) + (not (ediff-color-display-p)) + (copy-face 'modeline ediff-current-diff-face-A)) @@ -951,10 +919,10 @@ this variable represents.") (ediff-hide-face ediff-current-diff-face-B) ;; Until custom.el for XEmacs starts supporting :inverse-video we do this. ;; This means that some user customization may be trashed. -(if (and (featurep 'xemacs) - (ediff-has-face-support-p) - (not (ediff-color-display-p))) - (copy-face 'modeline ediff-current-diff-face-B)) +(and (featurep 'xemacs) + (ediff-has-face-support-p) + (not (ediff-color-display-p)) + (copy-face 'modeline ediff-current-diff-face-B)) (defface ediff-current-diff-C @@ -979,10 +947,10 @@ this variable represents.") (ediff-hide-face ediff-current-diff-face-C) ;; Until custom.el for XEmacs starts supporting :inverse-video we do this. ;; This means that some user customization may be trashed. -(if (and (featurep 'xemacs) - (ediff-has-face-support-p) - (not (ediff-color-display-p))) - (copy-face 'modeline ediff-current-diff-face-C)) +(and (featurep 'xemacs) + (ediff-has-face-support-p) + (not (ediff-color-display-p)) + (copy-face 'modeline ediff-current-diff-face-C)) (defface ediff-current-diff-Ancestor @@ -1007,10 +975,10 @@ this variable represents.") (ediff-hide-face ediff-current-diff-face-Ancestor) ;; Until custom.el for XEmacs starts supporting :inverse-video we do this. ;; This means that some user customization may be trashed. -(if (and (featurep 'xemacs) - (ediff-has-face-support-p) - (not (ediff-color-display-p))) - (copy-face 'modeline ediff-current-diff-face-Ancestor)) +(and (featurep 'xemacs) + (ediff-has-face-support-p) + (not (ediff-color-display-p)) + (copy-face 'modeline ediff-current-diff-face-Ancestor)) (defface ediff-fine-diff-A @@ -1356,33 +1324,28 @@ this variable represents.") (defun ediff-highest-priority (start end buffer) (let ((pos (max 1 (1- start))) ovr-list) - (ediff-cond-compile-for-xemacs-or-emacs - (1+ ediff-shadow-overlay-priority) ; xemacs form - ;; emacs form - (ediff-with-current-buffer buffer - (while (< pos (min (point-max) (1+ end))) - (setq ovr-list (append (overlays-at pos) ovr-list)) - (setq pos (next-overlay-change pos))) - (+ 1 ediff-shadow-overlay-priority - (apply 'max - (cons - 1 - (mapcar - (lambda (ovr) - (if (and ovr - ;; exclude ediff overlays from priority - ;; calculation, or else priority will keep - ;; increasing - (null (ediff-overlay-get ovr 'ediff)) - (null (ediff-overlay-get ovr 'ediff-diff-num))) - ;; use the overlay priority or 0 - (or (ediff-overlay-get ovr 'priority) 0) - 0)) - ovr-list) - ) - ))) - ) ; ediff-cond-compile-for-xemacs-or-emacs - )) + (if (featurep 'xemacs) + (1+ ediff-shadow-overlay-priority) + (ediff-with-current-buffer buffer + (while (< pos (min (point-max) (1+ end))) + (setq ovr-list (append (overlays-at pos) ovr-list)) + (setq pos (next-overlay-change pos))) + (+ 1 ediff-shadow-overlay-priority + (apply 'max + (cons + 1 + (mapcar + (lambda (ovr) + (if (and ovr + ;; exclude ediff overlays from priority + ;; calculation, or else priority will keep + ;; increasing + (null (ediff-overlay-get ovr 'ediff)) + (null (ediff-overlay-get ovr 'ediff-diff-num))) + ;; use the overlay priority or 0 + (or (ediff-overlay-get ovr 'priority) 0) + 0)) + ovr-list)))))))) (defvar ediff-toggle-read-only-function nil @@ -1437,8 +1400,6 @@ Instead, C-h would jump to previous difference." ;;; (file-name-as-directory ;;; (cond ((memq system-type '(ms-dos windows-nt)) ;;; (or (getenv "TEMP") (getenv "TMPDIR") (getenv "TMP") "c:/temp")) -;;; ((memq system-type '(vax-vms axp-vms)) -;;; (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "SYS$SCRATCH:")) ;;; (t ;;; (or (getenv "TMPDIR") (getenv "TMP") (getenv "TEMP") "/tmp")))) "*Prefix to put on Ediff temporary file names. @@ -1540,8 +1501,8 @@ This default should work without changes." ;; this record is itself a vector (defsubst ediff-clear-fine-diff-vector (diff-record) (if diff-record - (mapcar 'ediff-delete-overlay - (ediff-get-fine-diff-vector-from-diff-record diff-record)))) + (mapc 'ediff-delete-overlay + (ediff-get-fine-diff-vector-from-diff-record diff-record)))) (defsubst ediff-clear-fine-differences-in-one-buffer (n buf-type) (ediff-clear-fine-diff-vector (ediff-get-difference n buf-type)) @@ -1555,54 +1516,45 @@ This default should work without changes." (defsubst ediff-mouse-event-p (event) - (ediff-cond-compile-for-xemacs-or-emacs - (button-event-p event) ; xemacs form - (string-match "mouse" (format "%S" (event-basic-type event))) ; emacs form - )) + (if (featurep 'xemacs) + (button-event-p event) + (string-match "mouse" (format "%S" (event-basic-type event))))) (defsubst ediff-key-press-event-p (event) - (ediff-cond-compile-for-xemacs-or-emacs - (key-press-event-p event) ; xemacs form - (or (char-or-string-p event) (symbolp event)) ; emacs form - )) + (if (featurep 'xemacs) + (key-press-event-p event) + (or (char-or-string-p event) (symbolp event)))) (defun ediff-event-point (event) (cond ((ediff-mouse-event-p event) - (ediff-cond-compile-for-xemacs-or-emacs - (event-point event) ; xemacs form - (posn-point (event-start event)) ; emacs form - ) - ) + (if (featurep 'xemacs) + (event-point event) + (posn-point (event-start event)))) ((ediff-key-press-event-p event) (point)) - (t (error nil)))) + (t (error "Error")))) (defun ediff-event-buffer (event) (cond ((ediff-mouse-event-p event) - (ediff-cond-compile-for-xemacs-or-emacs - (event-buffer event) ; xemacs form - (window-buffer (posn-window (event-start event))) ; emacs form - ) - ) + (if (featurep 'xemacs) + (event-buffer event) + (window-buffer (posn-window (event-start event))))) ((ediff-key-press-event-p event) (current-buffer)) - (t (error nil)))) + (t (error "Error")))) (defun ediff-event-key (event-or-key) - (ediff-cond-compile-for-xemacs-or-emacs - (if (eventp event-or-key) (event-key event-or-key) event-or-key) ; xemacs - event-or-key ; emacs form - )) + (if (featurep 'xemacs) + (if (eventp event-or-key) (event-key event-or-key) event-or-key) + event-or-key)) (defsubst ediff-frame-iconified-p (frame) - (if (and (ediff-window-display-p) (frame-live-p frame)) - (ediff-cond-compile-for-xemacs-or-emacs - (frame-iconified-p frame) ; xemacs form - (eq (frame-visible-p frame) 'icon) ; emacs form - ) - )) + (and (ediff-window-display-p) (frame-live-p frame) + (if (featurep 'xemacs) + (frame-iconified-p frame) + (eq (frame-visible-p frame) 'icon)))) (defsubst ediff-window-visible-p (wind) ;; under TTY, window-live-p also means window is visible @@ -1612,10 +1564,9 @@ This default should work without changes." (defsubst ediff-frame-char-width (frame) - (ediff-cond-compile-for-xemacs-or-emacs - (/ (frame-pixel-width frame) (frame-width frame)) ; xemacs - (frame-char-width frame) ; emacs - )) + (if (featurep 'xemacs) + (/ (frame-pixel-width frame) (frame-width frame)) + (frame-char-width frame))) (defun ediff-reset-mouse (&optional frame do-not-grab-mouse) (or frame (setq frame (selected-frame))) @@ -1660,29 +1611,23 @@ This default should work without changes." (t nil)))) (defsubst ediff-frame-char-height (frame) - (ediff-cond-compile-for-xemacs-or-emacs - (glyph-height ediff-H-glyph (frame-selected-window frame)) ; xemacs case - (frame-char-height frame) ; emacs case - ) - ) + (if (featurep 'xemacs) + (glyph-height ediff-H-glyph (frame-selected-window frame)) + (frame-char-height frame))) ;; Some overlay functions (defsubst ediff-overlay-start (overl) (if (ediff-overlayp overl) - (ediff-cond-compile-for-xemacs-or-emacs - (extent-start-position overl) ; xemacs form - (overlay-start overl) ; emacs form - ) - )) + (if (featurep 'xemacs) + (extent-start-position overl) + (overlay-start overl)))) (defsubst ediff-overlay-end (overl) (if (ediff-overlayp overl) - (ediff-cond-compile-for-xemacs-or-emacs - (extent-end-position overl) ; xemacs form - (overlay-end overl) ; emacs form - ) - )) + (if (featurep 'xemacs) + (extent-end-position overl) + (overlay-end overl)))) (defsubst ediff-empty-overlay-p (overl) (= (ediff-overlay-start overl) (ediff-overlay-end overl))) @@ -1690,18 +1635,16 @@ This default should work without changes." ;; like overlay-buffer in Emacs. In XEmacs, returns nil if the extent is ;; dead. Otherwise, works like extent-buffer (defun ediff-overlay-buffer (overl) - (ediff-cond-compile-for-xemacs-or-emacs - (and (extent-live-p overl) (extent-object overl)) ; xemacs form - (overlay-buffer overl) ; emacs form - )) + (if (featurep 'xemacs) + (and (extent-live-p overl) (extent-object overl)) + (overlay-buffer overl))) ;; like overlay-get in Emacs. In XEmacs, returns nil if the extent is ;; dead. Otherwise, like extent-property (defun ediff-overlay-get (overl property) - (ediff-cond-compile-for-xemacs-or-emacs - (and (extent-live-p overl) (extent-property overl property)) ; xemacs form - (overlay-get overl property) ; emacs form - )) + (if (featurep 'xemacs) + (and (extent-live-p overl) (extent-property overl property)) + (overlay-get overl property))) ;; These two functions are here because XEmacs refuses to @@ -1711,10 +1654,9 @@ This default should work without changes." Checks if overlay's buffer exists before actually doing the move." (let ((buf (and overlay (ediff-overlay-buffer overlay)))) (if (ediff-buffer-live-p buf) - (ediff-cond-compile-for-xemacs-or-emacs - (set-extent-endpoints overlay beg end) ; xemacs form - (move-overlay overlay beg end buffer) ; emacs form - ) + (if (featurep 'xemacs) + (set-extent-endpoints overlay beg end) + (move-overlay overlay beg end buffer)) ;; buffer's dead (if overlay (ediff-delete-overlay overlay))))) @@ -1723,10 +1665,9 @@ Checks if overlay's buffer exists before actually doing the move." "Calls `overlay-put' or `set-extent-property' depending on Emacs version. Checks if overlay's buffer exists." (if (ediff-buffer-live-p (ediff-overlay-buffer overlay)) - (ediff-cond-compile-for-xemacs-or-emacs - (set-extent-property overlay prop value) ; xemacs form - (overlay-put overlay prop value) ; emacs form - ) + (if (featurep 'xemacs) + (set-extent-property overlay prop value) + (overlay-put overlay prop value)) (ediff-delete-overlay overlay))) ;; temporarily uses DIR to abbreviate file name @@ -1736,12 +1677,10 @@ Checks if overlay's buffer exists." (let ((directory-abbrev-alist (list (cons dir "")))) (abbreviate-file-name file))) (t - (ediff-cond-compile-for-xemacs-or-emacs - ;; XEmacs requires addl argument - (abbreviate-file-name file t) ; xemacs form - (abbreviate-file-name file)) ; emacs form - ) - )) + (if (featurep 'xemacs) + ;; XEmacs requires addl argument + (abbreviate-file-name file t) + (abbreviate-file-name file))))) ;; Takes a directory and returns the parent directory. ;; does nothing to `/'. If the ARG is a regular file, @@ -1822,9 +1761,6 @@ Unless optional argument INPLACE is non-nil, return a new string." "Don't skip difference regions." nil) -(defsubst Xor (a b) - (or (and a (not b)) (and (not a) b))) - (defsubst ediff-message-if-verbose (string &rest args) (if ediff-verbose-p (apply 'message string args))) @@ -1846,22 +1782,23 @@ Unless optional argument INPLACE is non-nil, return a new string." (convert-standard-filename fname) fname)) - -(if (fboundp 'with-syntax-table) +(if (featurep 'emacs) (defalias 'ediff-with-syntax-table 'with-syntax-table) - ;; stolen from subr.el in emacs 21 - (defmacro ediff-with-syntax-table (table &rest body) - (let ((old-table (make-symbol "table")) - (old-buffer (make-symbol "buffer"))) - `(let ((,old-table (syntax-table)) - (,old-buffer (current-buffer))) - (unwind-protect - (progn - (set-syntax-table (copy-syntax-table ,table)) - ,@body) - (save-current-buffer - (set-buffer ,old-buffer) - (set-syntax-table ,old-table))))))) + (if (fboundp 'with-syntax-table) + (defalias 'ediff-with-syntax-table 'with-syntax-table) + ;; stolen from subr.el in emacs 21 + (defmacro ediff-with-syntax-table (table &rest body) + (let ((old-table (make-symbol "table")) + (old-buffer (make-symbol "buffer"))) + `(let ((,old-table (syntax-table)) + (,old-buffer (current-buffer))) + (unwind-protect + (progn + (set-syntax-table (copy-syntax-table ,table)) + ,@body) + (save-current-buffer + (set-buffer ,old-buffer) + (set-syntax-table ,old-table)))))))) (provide 'ediff-init)