From 743a79af65deb52c211a8fb5b726979454e3f3b5 Mon Sep 17 00:00:00 2001 From: Michael Kifer Date: Wed, 20 Mar 2002 06:36:18 +0000 Subject: [PATCH] * ediff-diff.el (ediff-install-fine-diff-if-necessary): take the current highlighting style into account. (ediff-forward-word-function,ediff-whitespace,ediff-word-1, ediff-word-2,ediff-word-3,ediff-word-4): make them buffer local. * ediff-init.el (ediff-patch-job): new macro. * ediff-mult.el (ediff-make-new-meta-list-header): new API function. (ediff-intersect-directories): use ediff-make-new-meta-list-header. * ediff-ptch.el (ediff-map-patch-buffer): use ediff-make-new-meta-list-header. (ediff-fixup-patch-map): use the meta-list API from ediff-mult.el. * ediff-util.el (ediff-toggle-hilit): fix toggling of highliting. (ediff-select-difference): take highlighting style into account. (ediff-clone-buffer-for-region-comparison): new function. (ediff-inferior-compare-regions): added comparison of current diff regions. * ediff.el (ediff-clone-buffer-for-region-comparison, ediff-clone-buffer-for-window-comparison): moved to ediff-util.el. --- lisp/ChangeLog | 25 ++++++ lisp/cus-load.el | 45 +++++----- lisp/ediff-diff.el | 11 ++- lisp/ediff-init.el | 19 +++-- lisp/ediff-mult.el | 103 +++++++++++++++------- lisp/ediff-ptch.el | 186 ++++++++++++++++++++++++---------------- lisp/ediff-util.el | 208 ++++++++++++++++++++++++++++++++------------- lisp/ediff.el | 55 +----------- 8 files changed, 412 insertions(+), 240 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index a23be4a747c..673a52a6d53 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,28 @@ +2002-03-20 Michael Kifer + + * ediff-diff.el (ediff-install-fine-diff-if-necessary): take + the current highlighting style into account. + (ediff-forward-word-function,ediff-whitespace,ediff-word-1, + ediff-word-2,ediff-word-3,ediff-word-4): make them buffer local. + + * ediff-init.el (ediff-patch-job): new macro. + + * ediff-mult.el (ediff-make-new-meta-list-header): new API function. + (ediff-intersect-directories): use ediff-make-new-meta-list-header. + + * ediff-ptch.el (ediff-map-patch-buffer): use + ediff-make-new-meta-list-header. + (ediff-fixup-patch-map): use the meta-list API from ediff-mult.el. + + * ediff-util.el (ediff-toggle-hilit): fix toggling of highliting. + (ediff-select-difference): take highlighting style into account. + (ediff-clone-buffer-for-region-comparison): new function. + (ediff-inferior-compare-regions): added comparison of current diff + regions. + + * ediff.el (ediff-clone-buffer-for-region-comparison, + ediff-clone-buffer-for-window-comparison): moved to ediff-util.el. + 2002-03-19 pmr-sav * mail-utils.el (rmail-dont-reply-to): diff --git a/lisp/cus-load.el b/lisp/cus-load.el index bb0631fddcf..b386b57a8c1 100644 --- a/lisp/cus-load.el +++ b/lisp/cus-load.el @@ -36,9 +36,9 @@ (put 'woman-faces 'custom-loads '("woman")) (put 'ps-print-vertical 'custom-loads '("ps-print")) (put 'supercite-hooks 'custom-loads '("supercite")) +(put 'chinese-calendar 'custom-loads '("cal-china")) (put 'vhdl-menu 'custom-loads '("vhdl-mode")) (put 'gnus-newsrc 'custom-loads '("gnus-start")) -(put 'chinese-calendar 'custom-loads '("cal-china")) (put 'expand 'custom-loads '("expand")) (put 'bookmark 'custom-loads '("bookmark")) (put 'icon 'custom-loads '("icon")) @@ -130,7 +130,7 @@ (put 'iso-acc 'custom-loads '("iso-acc")) (put 'gnus-summary-pick 'custom-loads '("gnus-salt")) (put 'gnus-thread 'custom-loads '("gnus-sum")) -(put 'languages 'custom-loads '("cus-edit" "info-look" "ada-mode" "antlr-mode" "asm-mode" "cperl-mode" "dcl-mode" "delphi" "f90" "fortran" "hideshow" "icon" "idlwave" "m4-mode" "meta-mode" "modula2" "octave-mod" "pascal" "perl-mode" "prolog" "ps-mode" "sh-script" "simula" "tcl" "vhdl-mode" "sgml-mode")) +(put 'languages 'custom-loads '("cus-edit" "info-look" "ada-mode" "antlr-mode" "asm-mode" "cperl-mode" "dcl-mode" "delphi" "f90" "fortran" "hideshow" "icon" "idlwave" "m4-mode" "meta-mode" "modula2" "octave-mod" "pascal" "perl-mode" "prolog" "ps-mode" "sh-script" "simula" "tcl" "vhdl-mode" "sgml-mode" "xml-lite")) (put 'reftex-miscellaneous-configurations 'custom-loads '("reftex-vars")) (put 'pong 'custom-loads '("pong")) (put 'ediff-ptch 'custom-loads '("ediff-ptch")) @@ -144,14 +144,15 @@ (put 'nnmail-various 'custom-loads '("nnmail" "nntp")) (put 'smiley 'custom-loads '("smiley-ems")) (put 'extensions 'custom-loads '("generic" "time-stamp" "wid-edit" "cust-print" "eldoc" "page-ext")) -(put 'ebnf-displacement 'custom-loads '("ebnf2ps")) +(put 'tetris 'custom-loads '("tetris")) (put 'appt 'custom-loads '("appt")) +(put 'ebnf-displacement 'custom-loads '("ebnf2ps")) (put 'snmp 'custom-loads '("snmp-mode")) (put 'speedbar-faces 'custom-loads '("speedbar" "vhdl-mode")) (put 'rmail 'custom-loads '("paths" "rmail" "undigest")) (put 'ps-print-n-up 'custom-loads '("ps-print")) (put 'eshell-arg 'custom-loads '("esh-arg")) -(put 'ps-print-printer 'custom-loads '("ps-print")) +(put 'ps-print-printer 'custom-loads '("lpr" "ps-print")) (put 'message-various 'custom-loads '("message")) (put 'term 'custom-loads '("terminal" "term")) (put 'gnus-summary-exit 'custom-loads '("gnus-sum" "gnus")) @@ -245,6 +246,7 @@ (put 'cperl-indentation-details 'custom-loads '("cperl-mode")) (put 'mail-extr 'custom-loads '("mail-extr")) (put 'double 'custom-loads '("double")) +(put 'xml-lite 'custom-loads '("xml-lite")) (put 'imenu 'custom-loads '("imenu")) (put 'eshell-var 'custom-loads '("esh-var")) (put 'scribe 'custom-loads '("scribe")) @@ -273,7 +275,7 @@ (put 'generic-x 'custom-loads '("generic-x")) (put 'partial-completion 'custom-loads '("complete")) (put 'whitespace 'custom-loads '("whitespace")) -(put 'maint 'custom-loads '("gulp" "lisp-mnt" "emacsbug")) +(put 'maint 'custom-loads '("emacsbug" "gulp" "lisp-mnt")) (put 'pages 'custom-loads '("page-ext")) (put 'message-interface 'custom-loads '("message")) (put 'diary 'custom-loads '("calendar" "diary-lib")) @@ -300,7 +302,7 @@ (put 'apropos 'custom-loads '("apropos")) (put 'gomoku 'custom-loads '("gomoku")) (put 'eshell-pred 'custom-loads '("em-pred")) -(put 'tools 'custom-loads '("add-log" "calculator" "compare-w" "diff-mode" "diff" "ediff" "elide-head" "emerge" "gud" "pcvs-defs" "smerge-mode" "speedbar" "tempo" "tooltip" "vc" "which-func" "copyright" "rcompile" "compile" "ebrowse" "etags" "glasses" "make-mode")) +(put 'tools 'custom-loads '("add-log" "calculator" "compare-w" "diff-mode" "diff" "ediff" "elide-head" "emerge" "gud" "pcvs-defs" "smerge-mode" "speedbar" "tempo" "tooltip" "vc" "which-func" "rcompile" "copyright" "compile" "ebrowse" "etags" "glasses" "make-mode")) (put 'gnus-topic 'custom-loads '("gnus-topic")) (put 'sgml 'custom-loads '("sgml-mode")) (put 'keyboard 'custom-loads '("mule" "chistory" "type-break")) @@ -359,7 +361,7 @@ (put 'gnus-article-mime 'custom-loads '("gnus-art" "mm-uu")) (put 'emulations 'custom-loads '("crisp" "tpu-edt" "vip" "viper")) (put 'compression 'custom-loads '("jka-compr")) -(put 'games 'custom-loads '("5x5" "bruce" "decipher" "dunnet" "fortune" "gametree" "gomoku" "handwrite" "hanoi" "landmark" "mpuz" "pong" "solitaire" "spook" "yow")) +(put 'games 'custom-loads '("5x5" "bruce" "decipher" "dunnet" "fortune" "gametree" "gomoku" "handwrite" "hanoi" "landmark" "mpuz" "pong" "solitaire" "spook" "tetris" "yow")) (put 'nnmail-retrieve 'custom-loads '("nnmail")) (put 'gnus-duplicate 'custom-loads '("gnus-dup")) (put 'find-function 'custom-loads '("find-func")) @@ -393,7 +395,8 @@ (put 'change-log 'custom-loads '("add-log")) (put 'gnus-group-levels 'custom-loads '("gnus-group" "gnus-start" "gnus")) (put 'cperl 'custom-loads '("cperl-mode")) -(put 'bs-appearance 'custom-loads '("bs" "button")) +(put 'bs-appearance 'custom-loads '("bs")) +(put 'nil 'custom-loads '("button")) (put 'pcmpl-cvs 'custom-loads '("pcmpl-cvs")) (put 'eshell-mode 'custom-loads '("esh-mode")) (put 'files 'custom-loads '("mule" "files" "autoinsert" "autorevert" "cus-edit" "filecache" "recentf" "shadow" "ange-ftp")) @@ -420,7 +423,7 @@ (put 'gnus-article-hiding 'custom-loads '("gnus-art" "gnus-sum")) (put 'vhdl-mode 'custom-loads '("vhdl-mode")) (put 'lpr 'custom-loads '("lpr")) -(put 'ispell 'custom-loads '("ispell")) +(put 'ispell 'custom-loads '("flyspell" "ispell")) (put 'auto-revert 'custom-loads '("autorevert")) (put 'advice 'custom-loads '("advice")) (put 'picture 'custom-loads '("picture")) @@ -495,7 +498,7 @@ (put 'reftex-index-support 'custom-loads '("reftex-vars")) (put 'pascal 'custom-loads '("pascal")) (put 'rmail-retrieve 'custom-loads '("rmail" "rmailsum")) -(put 'data 'custom-loads '("text-mode" "arc-mode" "forms" "hexl" "jka-compr" "saveplace" "sort" "tar-mode" "time-stamp" "timeclock" "snmp-mode")) +(put 'data 'custom-loads '("text-mode" "arc-mode" "forms" "hexl" "jka-compr" "saveplace" "sort" "tar-mode" "time-stamp" "snmp-mode" "timeclock")) (put 'mail 'custom-loads '("simple" "startup" "time" "gnus" "mail-utils" "mm-decode" "message" "imap" "starttls" "emacsbug" "feedmail" "mail-extr" "mail-hist" "mailalias" "metamail" "mh-e" "mspools" "rmail" "sendmail" "smtpmail" "supercite" "uce" "eudc-vars" "fortune")) (put 'paren-blinking 'custom-loads '("simple")) (put 'gnus-summary-sort 'custom-loads '("gnus-sum")) @@ -682,12 +685,8 @@ (custom-put-if-not 'elide-head 'group-documentation "Eliding copyright headers and the like in source files.") (custom-put-if-not 'ps-line-number-color 'custom-version "21.1") (custom-put-if-not 'ps-line-number-color 'standard-value t) -(custom-put-if-not 'sgml-xml 'custom-version "21.2") -(custom-put-if-not 'sgml-xml 'standard-value t) (custom-put-if-not 'confirm-kill-emacs 'custom-version "21.1") (custom-put-if-not 'confirm-kill-emacs 'standard-value t) -(custom-put-if-not 'vc-rcs-checkout-switches 'custom-version "21.1") -(custom-put-if-not 'vc-rcs-checkout-switches 'standard-value t) (custom-put-if-not 'change-log-conditionals-face 'custom-version "21.1") (custom-put-if-not 'change-log-conditionals-face 'group-documentation nil) (custom-put-if-not 'mail-source 'custom-version "21.1") @@ -734,10 +733,16 @@ the tasks accomplished by such tools.") (custom-put-if-not 'ps-line-spacing 'standard-value t) (custom-put-if-not 'help-highlight-p 'custom-version "20.3") (custom-put-if-not 'help-highlight-p 'standard-value t) +(custom-put-if-not 'ange-ftp-raw-login 'custom-version "21.3") +(custom-put-if-not 'ange-ftp-raw-login 'standard-value t) (custom-put-if-not 'ps-paragraph-spacing 'custom-version "21.1") (custom-put-if-not 'ps-paragraph-spacing 'standard-value t) +(custom-put-if-not 'auto-hscroll-mode 'custom-version "21.1") +(custom-put-if-not 'auto-hscroll-mode 'standard-value t) (custom-put-if-not 'flyspell-incorrect-hook 'custom-version "21.1") (custom-put-if-not 'flyspell-incorrect-hook 'standard-value t) +(custom-put-if-not 'mode-line-inactive 'custom-version "21.2") +(custom-put-if-not 'mode-line-inactive 'group-documentation nil) (custom-put-if-not 'browse-url-mosaic-program 'custom-version "20.3") (custom-put-if-not 'browse-url-mosaic-program 'standard-value t) (custom-put-if-not 'vc-cvs-register-switches 'custom-version "21.1") @@ -770,8 +775,6 @@ the tasks accomplished by such tools.") (custom-put-if-not 'ps-print-footer-frame 'standard-value t) (custom-put-if-not 'tildify 'custom-version "21.1") (custom-put-if-not 'tildify 'group-documentation "Adding missing hard spaces or other text fragments into texts.") -(custom-put-if-not 'vc-rcs-checkin-switches 'custom-version "21.1") -(custom-put-if-not 'vc-rcs-checkin-switches 'standard-value t) (custom-put-if-not 'normal-erase-is-backspace 'custom-version "21.1") (custom-put-if-not 'normal-erase-is-backspace 'standard-value t) (custom-put-if-not 'gnus-article-banner-alist 'custom-version "21.1") @@ -823,8 +826,6 @@ as a PDF file .") (custom-put-if-not 'gnus-auto-expirable-marks 'standard-value t) (custom-put-if-not 'sql-interbase-options 'custom-version "20.8") (custom-put-if-not 'sql-interbase-options 'standard-value t) -(custom-put-if-not 'automatic-hscrolling 'custom-version "21.1") -(custom-put-if-not 'automatic-hscrolling 'standard-value t) (custom-put-if-not 'custom-buffer-done-function 'custom-version "21.1") (custom-put-if-not 'custom-buffer-done-function 'standard-value t) (custom-put-if-not 'gnus-article-mime-match-handle-function 'custom-version "21.1") @@ -833,6 +834,8 @@ as a PDF file .") (custom-put-if-not 'sql-db2-options 'standard-value t) (custom-put-if-not 'cwarn 'custom-version "21.1") (custom-put-if-not 'cwarn 'group-documentation "Highlight suspicious C and C++ constructions.") +(custom-put-if-not 'sgml-xml-mode 'custom-version "21.2") +(custom-put-if-not 'sgml-xml-mode 'standard-value t) (custom-put-if-not 'message-buffer-naming-style 'custom-version "21.1") (custom-put-if-not 'message-buffer-naming-style 'standard-value t) (custom-put-if-not 'ps-footer-font-size 'custom-version "21.1") @@ -1041,6 +1044,8 @@ as a PDF file .") (custom-put-if-not 'keyboard-coding-system 'standard-value t) (custom-put-if-not 'sql-sybase-options 'custom-version "20.8") (custom-put-if-not 'sql-sybase-options 'standard-value t) +(custom-put-if-not 'vc-cvs-sticky-tag-display 'custom-version "21.3") +(custom-put-if-not 'vc-cvs-sticky-tag-display 'standard-value t) (custom-put-if-not 'gnus-read-newsrc-file 'custom-version "21.1") (custom-put-if-not 'gnus-read-newsrc-file 'standard-value t) (custom-put-if-not 'recentf 'custom-version "21.1") @@ -1137,6 +1142,8 @@ as a PDF file .") (custom-put-if-not 'vc-dired-terse-display 'standard-value t) (custom-put-if-not 'server-kill-new-buffers 'custom-version "21.1") (custom-put-if-not 'server-kill-new-buffers 'standard-value t) +(custom-put-if-not 'vc-cvs-sticky-date-format-string 'custom-version "21.3") +(custom-put-if-not 'vc-cvs-sticky-date-format-string 'standard-value t) (custom-put-if-not 'speedbar-hide-button-brackets-flag 'custom-version "21.1") (custom-put-if-not 'speedbar-hide-button-brackets-flag 'standard-value t) (custom-put-if-not 'delphi 'custom-version "21.1") @@ -1144,7 +1151,7 @@ as a PDF file .") (custom-put-if-not 'eval-expression-print-level 'custom-version "21.1") (custom-put-if-not 'eval-expression-print-level 'standard-value t) -(defvar custom-versions-load-alist '((20.3 "xscheme") ("20.3.3" "dos-vars") (21.1 "ange-ftp") ("21.3" "replace") ("20.4" "files" "help" "sh-script" "compile") (21.3 "ange-ftp") ("21.2" "add-log" "sgml-mode") ("20.3" "desktop" "easymenu" "hscroll" "dabbrev" "ffap" "rmail" "paren" "mailabbrev" "frame" "uce" "mouse" "diary-lib" "sendmail" "simple" "debug" "hexl" "vcursor" "vc" "compile" "etags" "help-mode" "browse-url" "add-log" "find-func" "cus-edit" "replace") ("21.1" "server" "debug" "rmailedit" "dabbrev" "isearch" "gnus-start" "mule" "hideshow" "sendmail" "paths" "sgml-mode" "net-utils" "cperl-mode" "rmail" "font-lock" "gnus-nocem" "vc-hooks" "paren" "faces" "fortran" "vc" "etags" "cus-edit" "frame" "vc-sccs" "gnus-group" "gnus-sum" "add-log" "find-func" "wid-edit" "smtpmail" "vc-rcs" "files" "nnmail" "message" "ps-print" "vc-cvs" "simple" "gnus-agent" "flyspell" "gnus-art" "browse-url" "speedbar") ("20.8" "sql")) +(defvar custom-versions-load-alist '((20.3 "xscheme") ("20.3.3" "dos-vars") (21.1 "ange-ftp") ("20.4" "files" "help" "sh-script" "compile") ("21.2" "add-log" "sgml-mode") ("21.3" "vc-cvs" "replace" "ange-ftp") (21.3 "ange-ftp") ("20.3" "desktop" "easymenu" "hscroll" "dabbrev" "ffap" "rmail" "paren" "mailabbrev" "frame" "uce" "mouse" "diary-lib" "sendmail" "simple" "debug" "hexl" "vcursor" "vc" "compile" "etags" "help-mode" "browse-url" "add-log" "find-func" "cus-edit" "replace") ("21.1" "server" "debug" "rmailedit" "dabbrev" "isearch" "gnus-start" "mule" "hideshow" "sendmail" "paths" "sgml-mode" "net-utils" "cperl-mode" "rmail" "font-lock" "gnus-nocem" "vc-hooks" "paren" "faces" "vc-rcs" "fortran" "vc" "etags" "cus-edit" "vc-sccs" "gnus-group" "gnus-sum" "add-log" "find-func" "frame" "wid-edit" "smtpmail" "files" "nnmail" "message" "ps-print" "vc-cvs" "simple" "gnus-agent" "flyspell" "gnus-art" "browse-url" "speedbar") ("20.8" "sql")) "For internal use by custom.") (provide 'cus-load) diff --git a/lisp/ediff-diff.el b/lisp/ediff-diff.el index 7815e632502..31c54636c68 100644 --- a/lisp/ediff-diff.el +++ b/lisp/ediff-diff.el @@ -783,7 +783,10 @@ one optional arguments, diff-number to refine.") ;; Interface to ediff-make-fine-diffs. Checks for auto-refine limit, etc. (defun ediff-install-fine-diff-if-necessary (n) - (cond ((eq ediff-auto-refine 'on) + (cond ((and (eq ediff-auto-refine 'on) + ediff-use-faces + (not (eq ediff-highlighting-style 'off)) + (not (eq ediff-highlighting-style 'ascii))) (if (and (> ediff-auto-refine-limit (- (ediff-get-diff-posn 'A 'end n) @@ -1215,32 +1218,38 @@ delimiter regions")) (defvar ediff-forward-word-function 'ediff-forward-word "*Function to call to move to the next word. Used for splitting difference regions into individual words.") +(make-variable-buffer-local 'ediff-forward-word-function) (defvar ediff-whitespace " \n\t\f" "*Characters constituting white space. These characters are ignored when differing regions are split into words.") +(make-variable-buffer-local 'ediff-whitespace) (defvar ediff-word-1 (ediff-cond-compile-for-xemacs-or-emacs "a-zA-Z---_" "-[:word:]_") "*Characters that constitute words of type 1. More precisely, [ediff-word-1] is a regexp that matches type 1 words. See `ediff-forward-word' for more details.") +(make-variable-buffer-local 'ediff-word-1) (defvar ediff-word-2 "0-9.," "*Characters that constitute words of type 2. More precisely, [ediff-word-2] is a regexp that matches type 2 words. See `ediff-forward-word' for more details.") +(make-variable-buffer-local 'ediff-word-2) (defvar ediff-word-3 "`'?!:;\"{}[]()" "*Characters that constitute words of type 3. More precisely, [ediff-word-3] is a regexp that matches type 3 words. See `ediff-forward-word' for more details.") +(make-variable-buffer-local 'ediff-word-3) (defvar ediff-word-4 (concat "^" ediff-word-1 ediff-word-2 ediff-word-3 ediff-whitespace) "*Characters that constitute words of type 4. More precisely, [ediff-word-4] is a regexp that matches type 4 words. See `ediff-forward-word' for more details.") +(make-variable-buffer-local 'ediff-word-4) ;; Split region along word boundaries. Each word will be on its own line. ;; Output to buffer out-buffer. diff --git a/lisp/ediff-init.el b/lisp/ediff-init.el index cfa1ce9da7d..dd4e6ac7a19 100644 --- a/lisp/ediff-init.el +++ b/lisp/ediff-init.el @@ -78,7 +78,8 @@ that Ediff doesn't know about.") (ediff-force-faces) ((ediff-color-display-p)) (ediff-emacs-p (memq (ediff-device-type) '(pc))) - (ediff-xemacs-p (memq (ediff-device-type) '(tty pc))))) + (ediff-xemacs-p (memq (ediff-device-type) '(tty pc))) + )) ;; toolbar support for emacs hasn't been implemented in ediff (defun ediff-has-toolbar-support-p () @@ -289,6 +290,9 @@ It needs to be killed when we quit the session.") ediff-merge-revisions-with-ancestor))) (ediff-defvar-local ediff-merge-job nil "") +(defmacro ediff-patch-job () + `(eq ediff-job-name 'epatch)) + (defmacro ediff-merge-with-ancestor-job () `(memq ediff-job-name @@ -630,11 +634,6 @@ shown in brighter colors." :type 'boolean :group 'ediff-highlighting) -;; A var local to each control panel buffer. Indicates highlighting style -;; in effect for this buffer: `face', `ascii', nil -- temporarily -;; unhighlighted, `off' -- turned off \(on a dumb terminal only\). -(ediff-defvar-local ediff-highlighting-style nil "") - ;; The suffix of the control buffer name. (ediff-defvar-local ediff-control-buffer-suffix nil "") @@ -809,6 +808,14 @@ to temp files when Ediff needs to find fine differences." (error nil))) +;; A var local to each control panel buffer. Indicates highlighting style +;; in effect for this buffer: `face', `ascii', +;; `off' -- turned off \(on a dumb terminal only\). +(ediff-defvar-local ediff-highlighting-style + (if (and (ediff-has-face-support-p) ediff-use-faces) 'face 'ascii) + "") + + (if (ediff-has-face-support-p) (ediff-cond-compile-for-xemacs-or-emacs (progn ; xemacs diff --git a/lisp/ediff-mult.el b/lisp/ediff-mult.el index 83dde656a15..e49ab14d2db 100644 --- a/lisp/ediff-mult.el +++ b/lisp/ediff-mult.el @@ -40,17 +40,25 @@ ;; 3. Provide a list of pairs or triples of file names (or buffers, ;; depending on the particular Ediff operation you want to invoke) ;; in the following format: -;; (descriptor-header (nil nil (obj1 nil) (obj2 nil) (obj3 nil)) +;; (HEADER (nil nil (obj1 nil) (obj2 nil) (obj3 nil)) ;; (...) ...) ;; The function ediff-make-new-meta-list-element can be used to create -;; 2nd and subsequent elements of that list. -;; Actually, the format of this list is pretty much up to the -;; developer. The only thing is that it must be a list of lists, -;; and the first list must describe the meta session, and subsequent -;; elements must describe individual sessions. -;; This descriptor-header must be a list of SIX elements (nil or -;; string). The function ediff-redraw-registry-buffer displays the +;; 2nd and subsequent elements of that list (i.e., after the +;; description header). See ediff-make-new-meta-list-element for the +;; explanation of the two nil placeholders in such elements. +;; +;; There is API for extracting the components of the members of the +;; above list. Search for `API for ediff-meta-list' for details. +;; +;; HEADER must be a list of SIX elements (nil or string): +;; (regexp metaobj1 metaobj2 metaobj3 merge-save-buffer +;; comparison-function) +;; The function ediff-redraw-registry-buffer displays the ;; 1st - 4th of these in the registry buffer. +;; For some jobs some of the members of the header might be nil. +;; The meaning of metaobj1, metaobj2, and metaobj3 depend on the job. +;; Typically these are directories where the files to be compared are +;; found. ;; Also, keep in mind that the function ediff-prepare-meta-buffer ;; (which see) prepends the session group buffer to the descriptor, so ;; the descriptor becomes 7-long. @@ -61,12 +69,16 @@ ;; to any of Ediff major entries (such as ediff-files, epatch, etc.). ;; See how this is done in ediff-filegroup-action. ;; -;; Session descriptions are of the form (obj1 obj2 obj3), which -;; describe objects relevant to the session. Usually they are names of -;; files, but sometimes they may be other things. For instance, obj3 -;; is nil for jobs that involve only two files. For patch jobs, obj2 -;; and obj3 are markers that specify the patch corresponding to the -;; file (whose name is obj1). +;; Session descriptions are of the form +;; (nil nil (obj1 . nil) (obj2 . nil) (obj3 . nil)) +;; which describe the objects relevant to the session. +;; Use ediff-make-new-meta-list-element to create these things. +;; Usually obj1/2/3 are names of files, but they may also be other +;; things for some jobs. For instance, obj3 is nil for jobs that +;; involve only two files. For patch jobs, obj2 and obj3 are markers +;; that specify the patch corresponding to the file +;; (whose name is obj1). +;; The nil's are placeholders, which are used internally by ediff. ;; 4. Write a function that makes a call to ediff-prepare-meta-buffer ;; passing all this info. ;; You may be able to use ediff-directories-internal as a template. @@ -278,6 +290,8 @@ buffers." (nth 3 elt)) (defsubst ediff-get-session-objC (elt) (nth 4 elt)) +;; Take the "name" component of the object into acount. ObjA/C/B is of the form +;; (name . equality-indicator) (defsubst ediff-get-session-objA-name (elt) (car (nth 2 elt))) (defsubst ediff-get-session-objB-name (elt) @@ -293,17 +307,27 @@ buffers." ;; Create a new element for the meta list out of obj1/2/3, which usually are ;; files ;; -;; The first nil in such an is later replaced with the session buffer. The -;; second nil is reserved for session status. +;; The first nil in such an element is later replaced with the session buffer. +;; The second nil is reserved for session status. ;; ;; Also, session objects A/B/C are turned into lists of the form (obj nil). -;; This nill is a placeholder for eq-indicator. It is either nil or =. +;; This nil is a placeholder for eq-indicator. It is either nil or =. ;; If it is discovered that this file is = to some other ;; file in the same session, eq-indicator is changed to `='. ;; Curently, the eq-indicator is used only for 2 and 3-file jobs. (defun ediff-make-new-meta-list-element (obj1 obj2 obj3) (list nil nil (list obj1 nil) (list obj2 nil) (list obj3 nil))) +;; Constructs a meta list header. +;; OBJA, OBJB, OBJC are usually directories involved, but can be different for +;; different jobs. For instance, multifile patch has only OBJA, which is the +;; patch buffer. +(defun ediff-make-new-meta-list-header (regexp + objA objB objC + merge-auto-store-dir + comparison-func) + (list regexp objA objB objC merge-auto-store-dir comparison-func)) + ;; The activity marker is either or + (active session, i.e., ediff is currently ;; run in it), or - (finished session, i.e., we've ran ediff in it and then ;; exited). Return nil, if session is neither active nor finished @@ -485,18 +509,31 @@ behavior." ;; If a file is a directory in dir1 but not dir2 (or vice versa), it is not ;; included in the intersection. However, a regular file that is a dir in dir3 ;; is included, since dir3 files are supposed to be ancestors for merging. -;; Returns a list of the form: -;; (DIFF-LIST META-HEADER (f1 f2 f3) (f1 f2 f3) ...) -;; dir3, f3 can be nil if intersecting only 2 directories. ;; If COMPARISON-FUNC is given, use it. Otherwise, use string= +;; +;; Returns a list of the form: +;; (COMMON-PART DIFF-LIST) +;; COMMON-PART is car and DIFF-LIST is cdr. +;; +;; COMMON-PART is of the form: +;; (META-HEADER (f1 f2 f3) (f1 f2 f3) ...) +;; f3 can be nil if intersecting only 2 directories. +;; Each triple (f1 f2 f3) represents the files to be compared in the +;; corresponding ediff subsession. +;; ;; DIFF-LIST is of the form: ;; (META-HEADER (file . num) (file . num)...) ;; where num encodes the set of dirs where the file is found: ;; 2 - only dir1; 3 - only dir2; 5 - only dir3; 6 - dir1&2; 10 - dir1&3; etc. -;; META-HEADER is of the form -;; It contains the meta info about this ediff operation +;; META-HEADER: +;; Contains the meta info about this ediff operation ;; (regexp dir1 dir2 dir3 merge-auto-store-dir comparison-func) ;; Later the meta-buffer is prepended to this list. +;; +;; Some operations might use a different meta header. For instance, +;; ediff-multifile-patch doesn't have dir2 and dir3, and regexp, +;; comparison-func don't apply. +;; (defun ediff-intersect-directories (jobname regexp dir1 dir2 &optional @@ -572,19 +609,19 @@ behavior." difflist) (setq difflist (cons ;; diff metalist header - (list regexp - auxdir1 auxdir2 auxdir3 - merge-autostore-dir - comparison-func) + (ediff-make-new-meta-list-header regexp + auxdir1 auxdir2 auxdir3 + merge-autostore-dir + comparison-func) difflist)) (setq common-part (cons ;; metalist header - (list regexp - auxdir1 auxdir2 auxdir3 - merge-autostore-dir - comparison-func) + (ediff-make-new-meta-list-header regexp + auxdir1 auxdir2 auxdir3 + merge-autostore-dir + comparison-func) (mapcar (lambda (elt) (ediff-make-new-meta-list-element @@ -652,7 +689,9 @@ behavior." (cons ;; header -- has 6 elements. Meta buffer is prepended later by ;; ediff-prepare-meta-buffer - (list regexp auxdir1 nil nil merge-autostore-dir nil) + (ediff-make-new-meta-list-header regexp + auxdir1 nil nil + merge-autostore-dir nil) (mapcar (lambda (elt) (ediff-make-new-meta-list-element (concat auxdir1 elt) nil nil)) common)) @@ -2222,7 +2261,7 @@ If this is a session registry buffer then just bury it." (or (ediff-buffer-live-p session-buf) ; either an active patch session (null session-buf) ; or it is a virgin session (error - "Patch has been already applied to this file--cannot be repeated!")) + "Patch has already been applied to this file -- can't repeat!")) (ediff-with-current-buffer meta-patchbuf (save-restriction diff --git a/lisp/ediff-ptch.el b/lisp/ediff-ptch.el index b3ee2f9a527..0b6bc49e290 100644 --- a/lisp/ediff-ptch.el +++ b/lisp/ediff-ptch.el @@ -44,6 +44,8 @@ (let ((load-path (cons (expand-file-name ".") load-path))) (or (featurep 'ediff-init) (load "ediff-init.el" nil nil 'nosuffix)) + (or (featurep 'ediff-mult) + (load "ediff-mult.el" nil nil 'nosuffix)) (or (featurep 'ediff) (load "ediff.el" nil nil 'nosuffix)) )) @@ -181,11 +183,21 @@ program." count))) ;; Scan BUF (which is supposed to contain a patch) and make a list of the form -;; ((filename1 marker1 marker2) (filename2 marker1 marker2) ...) -;; where filenames are files to which patch would have applied the patch; -;; marker1 delimits the beginning of the corresponding patch and marker2 does -;; it for the end. This list is then assigned to ediff-patch-map. -;; Returns the number of elements in the list ediff-patch-map +;; ((nil nil filename-spec1 marker1 marker2) +;; (nil nil filename-spec2 marker1 marker2) ...) +;; where filename-spec[12] are files to which the `patch' program would +;; have applied the patch. +;; nin, nil are placeholders. See ediff-make-new-meta-list-element in +;; ediff-meta.el for the explanations. +;; In the beginning we don't know exactly which files need to be patched. +;; We usually come up with two candidates and ediff-file-name-sans-prefix +;; resolves this later. +;; +;; The marker `marker1' delimits the beginning of the corresponding patch and +;; `marker2' does it for the end. +;; The result of ediff-map-patch-buffer is a list, which is then assigned +;; to ediff-patch-map. +;; The function returns the number of elements in the list ediff-patch-map (defun ediff-map-patch-buffer (buf) (ediff-with-current-buffer buf (let ((count 0) @@ -210,7 +222,8 @@ program." end2 (or (match-end 3) (match-end 5))) ;; possible-file-names is holding the new file names until we ;; insert the old file name in the patch map - ;; It is a pair (filename from 1st header line . fn from 2nd line) + ;; It is a pair + ;; (filename-from-1st-header-line . fn from 2nd line) (setq possible-file-names (cons (if (and beg1 end1) (buffer-substring beg1 end1) @@ -227,14 +240,19 @@ program." (goto-char mark2-end) (if filenames - (setq patch-map (cons (list filenames mark1 mark2) patch-map))) + (setq patch-map + (cons (ediff-make-new-meta-list-element + filenames mark1 mark2) + patch-map))) (setq mark1 mark2 mark1-end mark2-end filenames possible-file-names)) (setq opoint (point) count (1+ count)))) (setq mark2 (point-max-marker) - patch-map (cons (list possible-file-names mark1 mark2) patch-map)) + patch-map (cons (ediff-make-new-meta-list-element + possible-file-names mark1 mark2) + patch-map)) (setq ediff-patch-map (nreverse patch-map)) count))) @@ -254,44 +272,53 @@ program." ;; directory part of filename (file-name-as-directory filename) (file-name-directory filename))) + ;; Filename-spec is objA; at this point it is represented as + ;; (file1 . file2). We get it using ediff-get-session-objA ;; directory part of the first file in the patch - (base-dir1 (file-name-directory (car (car (car ediff-patch-map))))) - (base-dir2 (file-name-directory (cdr (car (car ediff-patch-map))))) + (base-dir1 (file-name-directory + (car (ediff-get-session-objA-name (car ediff-patch-map))))) + ;; directory part of the 2nd file in the patch + (base-dir2 (file-name-directory + (cdr (ediff-get-session-objA-name (car ediff-patch-map))))) ) ;; chop off base-dirs - (mapcar (lambda (triple) - (or (string= (car (car triple)) "/dev/null") - (setcar (car triple) - (ediff-file-name-sans-prefix - (car (car triple)) base-dir1))) - (or (string= (cdr (car triple)) "/dev/null") - (setcdr (car triple) + (mapcar (lambda (session-info) + (let ((proposed-file-names + (ediff-get-session-objA-name session-info))) + (or (string= (car proposed-file-names) "/dev/null") + (setcar proposed-file-names + (ediff-file-name-sans-prefix + (car proposed-file-names) base-dir1))) + (or (string= + (cdr proposed-file-names) "/dev/null") + (setcdr proposed-file-names (ediff-file-name-sans-prefix - (cdr (car triple)) base-dir2))) - ) + (cdr proposed-file-names) base-dir2))) + )) ediff-patch-map) ;; take the given file name into account (or (file-directory-p filename) (string= "/dev/null" filename) - (progn - (setcar (car ediff-patch-map) - (cons (file-name-nondirectory filename) - (file-name-nondirectory filename))))) + (setcar (ediff-get-session-objA (car ediff-patch-map)) + (cons (file-name-nondirectory filename) + (file-name-nondirectory filename)))) ;; prepend actual-dir - (mapcar (lambda (triple) - (if (and (string-match "^/null/" (car (car triple))) - (string-match "^/null/" (cdr (car triple)))) - ;; couldn't strip base-dir1 and base-dir2 - ;; hence, something wrong - (progn - (with-output-to-temp-buffer ediff-msg-buffer - (ediff-with-current-buffer standard-output - (fundamental-mode)) - (princ - (format " + (mapcar (lambda (session-info) + (let ((proposed-file-names + (ediff-get-session-objA-name session-info))) + (if (and (string-match "^/null/" (car proposed-file-names)) + (string-match "^/null/" (cdr proposed-file-names))) + ;; couldn't strip base-dir1 and base-dir2 + ;; hence, something is wrong + (progn + (with-output-to-temp-buffer ediff-msg-buffer + (ediff-with-current-buffer standard-output + (fundamental-mode)) + (princ + (format " The patch file contains a context diff for %s %s @@ -302,47 +329,52 @@ please enter it now. If you don't know and still would like to apply patches to other files, enter /dev/null " - (substring (car (car triple)) 6) - (substring (cdr (car triple)) 6)))) - (let ((directory t) - user-file) - (while directory - (setq user-file - (read-file-name - "Please enter file name: " - actual-dir actual-dir t)) - (if (not (file-directory-p user-file)) - (setq directory nil) - (setq directory t) - (beep) - (message "%s is a directory" user-file) - (sit-for 2))) - (setcar triple (cons user-file user-file)))) - (setcar (car triple) - (expand-file-name - (concat actual-dir (car (car triple))))) - (setcdr (car triple) - (expand-file-name - (concat actual-dir (cdr (car triple)))))) - ) + (substring (car proposed-file-names) 6) + (substring (cdr proposed-file-names) 6)))) + (let ((directory t) + user-file) + (while directory + (setq user-file + (read-file-name + "Please enter file name: " + actual-dir actual-dir t)) + (if (not (file-directory-p user-file)) + (setq directory nil) + (setq directory t) + (beep) + (message "%s is a directory" user-file) + (sit-for 2))) + (setcar (ediff-get-session-objA session-info) + (cons user-file user-file)))) + (setcar proposed-file-names + (expand-file-name + (concat actual-dir (car proposed-file-names)))) + (setcdr proposed-file-names + (expand-file-name + (concat actual-dir (cdr proposed-file-names))))) + )) ediff-patch-map) ;; check for the shorter existing file in each pair and discard the other ;; one - (mapcar (lambda (triple) - (let* ((file1 (car (car triple))) - (file2 (cdr (car triple))) + (mapcar (lambda (session-info) + (let* ((file1 (car (ediff-get-session-objA-name session-info))) + (file2 (cdr (ediff-get-session-objA-name session-info))) + (session-file-object + (ediff-get-session-objA session-info)) (f1-exists (file-exists-p file1)) (f2-exists (file-exists-p file2))) (cond ((and (< (length file2) (length file1)) f2-exists) - (setcar triple file2)) + ;; replace file-pair with the winning file2 + (setcar session-file-object file2)) ((and (< (length file1) (length file2)) f1-exists) - (setcar triple file1)) + ;; replace file-pair with the winning file1 + (setcar session-file-object file1)) ((and f1-exists f2-exists (string= file1 file2)) - (setcar triple file1)) + (setcar session-file-object file1)) ((and f1-exists f2-exists) (with-output-to-temp-buffer ediff-msg-buffer (ediff-with-current-buffer standard-output @@ -359,11 +391,11 @@ Please advice: Type `n' to use %s as the target. " file1 file2 file2 file1))) - (setcar triple + (setcar session-file-object (if (y-or-n-p (format "Use %s ? " file2)) file2 file1))) - (f2-exists (setcar triple file2)) - (f1-exists (setcar triple file1)) + (f2-exists (setcar session-file-object file2)) + (f1-exists (setcar session-file-object file1)) (t (with-output-to-temp-buffer ediff-msg-buffer (ediff-with-current-buffer standard-output @@ -392,7 +424,7 @@ are two possible targets for this patch. However, these files do not exist." (beep) (message "%s is a directory" target) (sit-for 2))) - (setcar triple target)))))) + (setcar session-file-object target)))))) ediff-patch-map) )) @@ -491,9 +523,14 @@ optional argument, then use it." (ediff-patch-file-internal patch-buf (if (and ediff-patch-map - (not (string-match "^/dev/null" (car (car ediff-patch-map)))) - (> (length (car (car ediff-patch-map))) 1)) - (car (car ediff-patch-map)) + (not (string-match + "^/dev/null" + ;; this is the file to patch + (ediff-get-session-objA-name (car ediff-patch-map)))) + (> (length + (ediff-get-session-objA-name (car ediff-patch-map))) + 1)) + (ediff-get-session-objA-name (car ediff-patch-map)) filename) startup-hooks) (ediff-multi-patch-internal patch-buf startup-hooks)) @@ -739,8 +776,13 @@ you can still examine the changes via M-x ediff-files" (setq meta-buf (ediff-prepare-meta-buffer 'ediff-filegroup-action (ediff-with-current-buffer patch-buf - ;; nil replaces a regular expression - (cons (list nil (format "%S" patch-buf)) + (cons (ediff-make-new-meta-list-header + nil ; regexp + (format "%S" patch-buf) ; obj A + nil nil ; objects B,C + nil ; merge-auto-store-dir + nil ; comparison-func + ) ediff-patch-map)) "*Ediff Session Group Panel" 'ediff-redraw-directory-group-buffer diff --git a/lisp/ediff-util.el b/lisp/ediff-util.el index be9fbb424d3..99d01361624 100644 --- a/lisp/ediff-util.el +++ b/lisp/ediff-util.el @@ -233,7 +233,7 @@ to invocation.") (define-key ediff-mode-map "wb" 'ediff-save-buffer) (define-key ediff-mode-map "wd" 'ediff-save-buffer) (define-key ediff-mode-map "=" 'ediff-inferior-compare-regions) - (if (fboundp 'ediff-show-patch-diagnostics) + (if (and (fboundp 'ediff-show-patch-diagnostics) (ediff-patch-job)) (define-key ediff-mode-map "P" 'ediff-show-patch-diagnostics)) (if ediff-3way-job (progn @@ -910,36 +910,40 @@ Does nothing if file-A and file-B are in different frames." On a dumb terminal, switches between ASCII highlighting and no highlighting." (interactive) (ediff-barf-if-not-control-buffer) - (if (not (ediff-has-face-support-p)) - (if (eq ediff-highlighting-style 'ascii) - (progn - (message "ASCII highlighting flags removed") - (ediff-unselect-and-select-difference ediff-current-difference - 'unselect-only) - (setq ediff-highlighting-style 'off)) - (ediff-unselect-and-select-difference ediff-current-difference - 'select-only)) - (ediff-unselect-and-select-difference ediff-current-difference - 'unselect-only) - ;; cycle through highlighting - (cond ((and ediff-use-faces ediff-highlight-all-diffs) - (message "Unhighlighting unselected difference regions") - (setq ediff-highlight-all-diffs nil)) - (ediff-use-faces - (message "Highlighting with ASCII flags") - (setq ediff-use-faces nil)) - (t - (message "Re-highlighting all difference regions") - (setq ediff-use-faces t - ediff-highlight-all-diffs t))) - - (if (and ediff-use-faces ediff-highlight-all-diffs) - (ediff-paint-background-regions) - (ediff-paint-background-regions 'unhighlight)) - - (ediff-unselect-and-select-difference - ediff-current-difference 'select-only)) - ) + + (ediff-unselect-and-select-difference + ediff-current-difference 'unselect-only) + ;; cycle through highlighting + (cond ((and ediff-use-faces + (ediff-has-face-support-p) + ediff-highlight-all-diffs) + (message "Unhighlighting unselected difference regions") + (setq ediff-highlight-all-diffs nil + ediff-highlighting-style 'face)) + ((or (and ediff-use-faces (ediff-has-face-support-p) + (eq ediff-highlighting-style 'face)) ; has face support + (and (not (ediff-has-face-support-p)) ; no face support + (eq ediff-highlighting-style 'off))) + (message "Highlighting with ASCII flags") + (setq ediff-highlighting-style 'ascii + ediff-highlight-all-diffs nil + ediff-use-faces nil)) + ((eq ediff-highlighting-style 'ascii) + (message "ASCII highlighting flags removed") + (setq ediff-highlighting-style 'off + ediff-highlight-all-diffs nil)) + ((ediff-has-face-support-p) ; catch-all for cases with face support + (message "Re-highlighting all difference regions") + (setq ediff-use-faces t + ediff-highlighting-style 'face + ediff-highlight-all-diffs t))) + + (if (and ediff-use-faces ediff-highlight-all-diffs) + (ediff-paint-background-regions) + (ediff-paint-background-regions 'unhighlight)) + + (ediff-unselect-and-select-difference + ediff-current-difference 'select-only)) (defun ediff-toggle-autorefine () @@ -2909,23 +2913,22 @@ Hit \\[ediff-recenter] to reset the windows afterward." (ediff-buffer-live-p ediff-buffer-B) (ediff-valid-difference-p n)) (progn - (if (and (ediff-has-face-support-p) ediff-use-faces) - (progn - (ediff-highlight-diff n) - (setq ediff-highlighting-style 'face)) - (setq ediff-highlighting-style 'ascii) - (ediff-place-flags-in-buffer - 'A ediff-buffer-A ediff-control-buffer n) - (ediff-place-flags-in-buffer - 'B ediff-buffer-B ediff-control-buffer n) - (if ediff-3way-job - (ediff-place-flags-in-buffer - 'C ediff-buffer-C ediff-control-buffer n)) - (if (ediff-buffer-live-p ediff-ancestor-buffer) - (ediff-place-flags-in-buffer - 'Ancestor ediff-ancestor-buffer - ediff-control-buffer n)) - ) + (cond + ((and (ediff-has-face-support-p) ediff-use-faces) + (ediff-highlight-diff n)) + ((eq ediff-highlighting-style 'ascii) + (ediff-place-flags-in-buffer + 'A ediff-buffer-A ediff-control-buffer n) + (ediff-place-flags-in-buffer + 'B ediff-buffer-B ediff-control-buffer n) + (if ediff-3way-job + (ediff-place-flags-in-buffer + 'C ediff-buffer-C ediff-control-buffer n)) + (if (ediff-buffer-live-p ediff-ancestor-buffer) + (ediff-place-flags-in-buffer + 'Ancestor ediff-ancestor-buffer + ediff-control-buffer n)) + )) (ediff-install-fine-diff-if-necessary n) (run-hooks 'ediff-select-hook)))) @@ -2954,7 +2957,6 @@ Hit \\[ediff-recenter] to reset the windows afterward." ediff-ancestor-buffer (ediff-get-diff-overlay n 'Ancestor))) )) - (setq ediff-highlighting-style nil) ;; unhighlight fine diffs (ediff-set-fine-diff-properties ediff-current-difference 'default) @@ -2983,8 +2985,8 @@ Hit \\[ediff-recenter] to reset the windows afterward." (setq ediff-current-difference n) ) ; end protected section - (ediff-with-current-buffer control-buf (ediff-refresh-mode-lines)) - ))) + (ediff-with-current-buffer control-buf (ediff-refresh-mode-lines))) + )) @@ -3302,6 +3304,77 @@ Without an argument, it saves customized diff argument, if available ) (save-buffer))) + +;; idea suggested by Hannu Koivisto +(defun ediff-clone-buffer-for-region-comparison (buff region-name) + (let ((cloned-buff (ediff-make-cloned-buffer buff region-name)) + (wind (ediff-get-visible-buffer-window buff)) + (pop-up-windows t) + other-wind + msg-buf) + (ediff-with-current-buffer cloned-buff + (setq ediff-temp-indirect-buffer t)) + (if (window-live-p wind) + (set-window-buffer wind cloned-buff)) + (pop-to-buffer cloned-buff) + (with-temp-buffer + (erase-buffer) + (insert + (format "\n ******* Mark a region in buffer %s *******\n" + (buffer-name cloned-buff))) + (insert + (format "\n\t When done, type %s Use %s to abort\n " + (ediff-format-bindings-of 'exit-recursive-edit) + (ediff-format-bindings-of 'abort-recursive-edit))) + (goto-char (point-min)) + (setq msg-buf (current-buffer)) + (other-window 1) + (set-window-buffer (selected-window) msg-buf) + (shrink-window-if-larger-than-buffer) + (if (window-live-p wind) + (select-window wind)) + (condition-case nil + (recursive-edit) + (quit + (ediff-kill-buffer-carefully cloned-buff))) + ) + cloned-buff)) + + +(defun ediff-clone-buffer-for-window-comparison (buff wind region-name) + (let ((cloned-buff (ediff-make-cloned-buffer buff region-name))) + (ediff-with-current-buffer cloned-buff + (setq ediff-temp-indirect-buffer t)) + (set-window-buffer wind cloned-buff) + cloned-buff)) + +(defun ediff-clone-buffer-for-current-diff-comparison (buff buf-type reg-name) + (let ((cloned-buff (ediff-make-cloned-buffer buff reg-name)) + (reg-start (ediff-get-diff-posn buf-type 'beg)) + (reg-end (ediff-get-diff-posn buf-type 'end))) + (ediff-with-current-buffer cloned-buff + ;; set region to be the current diff region + (goto-char reg-start) + (set-mark reg-end) + (setq ediff-temp-indirect-buffer t)) + cloned-buff)) + + + +(defun ediff-make-cloned-buffer (buff region-name) + (ediff-make-indirect-buffer + buff (concat + (if (stringp buff) buff (buffer-name buff)) + region-name (symbol-name (gensym))))) + + +(defun ediff-make-indirect-buffer (base-buf indirect-buf-name) + (ediff-cond-compile-for-xemacs-or-emacs + (make-indirect-buffer base-buf indirect-buf-name) ; xemacs + (make-indirect-buffer base-buf indirect-buf-name 'clone) ; emacs + )) + + ;; This function operates only from an ediff control buffer (defun ediff-compute-custom-diffs-maybe () (let ((buf-A-file-name (buffer-file-name ediff-buffer-A)) @@ -3373,8 +3446,15 @@ Ediff Control Panel to restore highlighting." (zmacs-regions t) (ctl-buf (current-buffer)) quit-now + use-current-diff-p begA begB endA endB bufA bufB) + (if (ediff-valid-difference-p ediff-current-difference) + (progn + (ediff-set-fine-diff-properties ediff-current-difference 'default) + (ediff-unhighlight-diff))) + (ediff-paint-background-regions 'unhighlight) + (cond ((ediff-merge-job) (setq bufB ediff-buffer-C) ;; ask which buffer to compare to the merge buffer @@ -3440,8 +3520,14 @@ Ediff Control Panel to restore highlighting." bufB ediff-buffer-B possibilities nil))) - (setq bufA (ediff-clone-buffer-for-region-comparison - (buffer-name bufA) "-Region.A-")) + (if (and (ediff-valid-difference-p ediff-current-difference) + (y-or-n-p "Compare currently highlighted difference regions? ")) + (setq use-current-diff-p t)) + + (setq bufA (if use-current-diff-p + (ediff-clone-buffer-for-current-diff-comparison + bufA 'A "-Region.A-") + (ediff-clone-buffer-for-region-comparison bufA "-Region.A-"))) (ediff-with-current-buffer bufA (setq begA (region-beginning) endA (region-end)) @@ -3453,8 +3539,10 @@ Ediff Control Panel to restore highlighting." (or (eobp) (forward-char)) ; include the newline char (setq endA (point))) - (setq bufB (ediff-clone-buffer-for-region-comparison - (buffer-name bufB) "-Region.B-")) + (setq bufB (if use-current-diff-p + (ediff-clone-buffer-for-current-diff-comparison + bufB 'B "-Region.B-") + (ediff-clone-buffer-for-region-comparison bufB "-Region.B-"))) (ediff-with-current-buffer bufB (setq begB (region-beginning) endB (region-end)) @@ -3466,11 +3554,15 @@ Ediff Control Panel to restore highlighting." (or (eobp) (forward-char)) ; include the newline char (setq endB (point))) + (ediff-regions-internal bufA begA endA bufB begB endB - nil ; setup-hook - 'ediff-regions-linewise ; job name - nil ; no word mode + nil ; setup-hook + (if use-current-diff-p ; job name + 'ediff-regions-wordwise + 'ediff-regions-linewise) + (if use-current-diff-p ; word mode, if diffing current diff + t nil) ;; setup param to pass to ediff-setup (list (cons 'ediff-split-window-function ediff-split-window-function))) )) diff --git a/lisp/ediff.el b/lisp/ediff.el index 05f0fcbabfa..2db82f85547 100644 --- a/lisp/ediff.el +++ b/lisp/ediff.el @@ -851,55 +851,6 @@ If WIND-B is nil, use window next to WIND-A." buffer-A beg-A end-A buffer-B beg-B end-B startup-hooks job-name word-mode nil))) -;; Suggested by Hannu Koivisto -(defun ediff-clone-buffer-for-region-comparison (buff-name region-name) - (let ((cloned-buff (ediff-make-indirect-buffer - buff-name - (concat buff-name region-name - (symbol-name (gensym))))) - (wind (ediff-get-visible-buffer-window buff-name)) - (pop-up-windows t) - other-wind - msg-buf) - (ediff-with-current-buffer cloned-buff - (setq ediff-temp-indirect-buffer t)) - (if (window-live-p wind) - (set-window-buffer wind cloned-buff)) - (pop-to-buffer cloned-buff) - (with-temp-buffer - (erase-buffer) - (insert - (format "\n ******* Mark a region in buffer %s *******\n" - (buffer-name cloned-buff))) - (insert - (format "\n\t When done, type %s Use %s to abort\n " - (ediff-format-bindings-of 'exit-recursive-edit) - (ediff-format-bindings-of 'abort-recursive-edit))) - (goto-char (point-min)) - (setq msg-buf (current-buffer)) - (other-window 1) - (set-window-buffer (selected-window) msg-buf) - (shrink-window-if-larger-than-buffer) - (select-window wind) - (recursive-edit) - ) - cloned-buff)) - -(defun ediff-clone-buffer-for-window-comparison (buff wind region-name) - (let ((cloned-buff (ediff-make-indirect-buffer - buff - (concat (buffer-name buff) - region-name (symbol-name (gensym)))))) - (ediff-with-current-buffer cloned-buff - (setq ediff-temp-indirect-buffer t)) - (set-window-buffer wind cloned-buff) - cloned-buff)) - -(defun ediff-make-indirect-buffer (base-buf indirect-buf-name) - (ediff-cond-compile-for-xemacs-or-emacs - (make-indirect-buffer base-buf indirect-buf-name) ; xemacs - (make-indirect-buffer base-buf indirect-buf-name 'clone) ; emacs - )) ;;;###autoload (defun ediff-regions-wordwise (buffer-A buffer-B &optional startup-hooks) @@ -1237,7 +1188,7 @@ buffer." (setq rev1 (read-string (format - "Version 1 to merge (default: %s's latest version): " + "Version 1 to merge (default: %s's working version): " (if (stringp file) (file-name-nondirectory file) "current buffer"))) rev2 @@ -1269,7 +1220,7 @@ buffer." (setq rev1 (read-string (format - "Version 1 to merge (default: %s's latest version): " + "Version 1 to merge (default: %s's working version): " (if (stringp file) (file-name-nondirectory file) "current buffer"))) rev2 @@ -1385,7 +1336,7 @@ Uses `vc.el' or `rcs.el' depending on `ediff-version-control-package'." (let (rev1 rev2) (setq rev1 (read-string - (format "Version 1 to compare (default: %s's latest version): " + (format "Version 1 to compare (default: %s's working version): " (file-name-nondirectory file))) rev2 (read-string -- 2.39.2