annotate lisp/compare-w.el @ 55434:f88632e54afb

2004-05-08 John Wiegley <johnw@newartisans.com> * iswitchb.el (iswitchb-use-virtual-buffers): Added support for "virtual buffers" (off by default), which makes it possible to switch to the buffers of recently files. When a buffer name search fails, and this option is on, iswitchb will look at the list of recently visited files, and permit matching against those names. When the user hits RET on a match, it will revisit that file. (iswitchb-read-buffer): Added two optional arguments, which makes isearchb.el possible. (iswitchb-completions, iswitchb-set-matches, iswitchb-prev-match, iswitchb-next-match): Added support for virtual buffers.
author John Wiegley <johnw@newartisans.com>
date Sat, 08 May 2004 13:00:52 +0000
parents a8714ce78ab1
children 48114a286f9e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38412
253f761ad37b Some fixes to follow coding conventions in files maintained by FSF.
Pavel Janík <Pavel@Janik.cz>
parents: 24948
diff changeset
1 ;;; compare-w.el --- compare text between windows for Emacs
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 584
diff changeset
2
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
3 ;; Copyright (C) 1986, 1989, 1993, 1997, 2003 Free Software Foundation, Inc.
845
213978acbc1e entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 807
diff changeset
4
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
5 ;; Maintainer: FSF
45078
829beb9a6a4b Follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 44202
diff changeset
6 ;; Keywords: convenience files
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
7
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 ;; any later version.
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
14
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 ;; GNU General Public License for more details.
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 10031
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 10031
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 10031
diff changeset
23 ;; Boston, MA 02111-1307, USA.
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24
2307
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2011
diff changeset
25 ;;; Commentary:
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2011
diff changeset
26
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2011
diff changeset
27 ;; This package provides one entry point, compare-windows. It compares
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2011
diff changeset
28 ;; text starting from point in two adjacent windows, advancing point
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2011
diff changeset
29 ;; until it finds a difference. Option variables permit you to ignore
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2011
diff changeset
30 ;; whitespace differences, or case differences, or both.
10e417efb12a Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 2011
diff changeset
31
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
32 ;;; Code:
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
33
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 17542
diff changeset
34 (defgroup compare-w nil
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 17542
diff changeset
35 "Compare text between windows."
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 17542
diff changeset
36 :prefix "compare-"
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 17542
diff changeset
37 :group 'tools)
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 17542
diff changeset
38
46405
2bde7081136b (compare-windows-whitespace): Always allow newline
Richard M. Stallman <rms@gnu.org>
parents: 45078
diff changeset
39 (defcustom compare-windows-whitespace "\\(\\s-\\|\n\\)+"
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
40 "*Regexp or function that defines whitespace sequences for `compare-windows'.
46405
2bde7081136b (compare-windows-whitespace): Always allow newline
Richard M. Stallman <rms@gnu.org>
parents: 45078
diff changeset
41 That command optionally ignores changes in whitespace.
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42
46405
2bde7081136b (compare-windows-whitespace): Always allow newline
Richard M. Stallman <rms@gnu.org>
parents: 45078
diff changeset
43 The value of `compare-windows-whitespace' is normally a regexp, but it
2bde7081136b (compare-windows-whitespace): Always allow newline
Richard M. Stallman <rms@gnu.org>
parents: 45078
diff changeset
44 can also be a function. The function's job is to categorize any
2bde7081136b (compare-windows-whitespace): Always allow newline
Richard M. Stallman <rms@gnu.org>
parents: 45078
diff changeset
45 whitespace around (including before) point; it should also advance
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
46 past any whitespace. The function is called in each window, with
46405
2bde7081136b (compare-windows-whitespace): Always allow newline
Richard M. Stallman <rms@gnu.org>
parents: 45078
diff changeset
47 point at the current scanning point. It gets one argument, the point
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
48 where \\[compare-windows] was originally called; it should not look at
46405
2bde7081136b (compare-windows-whitespace): Always allow newline
Richard M. Stallman <rms@gnu.org>
parents: 45078
diff changeset
49 any text before that point.
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
50
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
51 If the function returns the same value for both windows, then the
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 17542
diff changeset
52 whitespace is considered to match, and is skipped."
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 17542
diff changeset
53 :type '(choice regexp function)
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 17542
diff changeset
54 :group 'compare-w)
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
56 (defcustom compare-ignore-whitespace nil
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
57 "*Non-nil means `compare-windows' ignores whitespace."
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
58 :type 'boolean
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
59 :group 'compare-w)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
60
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 17542
diff changeset
61 (defcustom compare-ignore-case nil
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
62 "*Non-nil means `compare-windows' ignores case differences."
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 17542
diff changeset
63 :type 'boolean
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 17542
diff changeset
64 :group 'compare-w)
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
65
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
66 (defcustom compare-windows-sync 'compare-windows-sync-default-function
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
67 "*Function or regexp that is used to synchronize points in two
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
68 windows if before calling `compare-windows' points are located
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
69 on mismatched positions.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
70
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
71 The value of `compare-windows-sync' can be a function. The
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
72 function's job is to advance points in both windows to the next
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
73 matching text. If the value of `compare-windows-sync' is a
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
74 regexp, then points in both windows are advanced to the next
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
75 occurrence of this regexp.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
76
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
77 The current default value is the general function
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
78 `compare-windows-sync-default-function' that is able to
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
79 synchronize points by using quadratic algorithm to find the first
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
80 matching 32-character string in two windows.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
81
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
82 The other useful values of this variable could be such functions
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
83 as `forward-word', `forward-sentence', `forward-paragraph', or a
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
84 regexp containing some field separator or a newline, depending on
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
85 the nature of the difference units separator. The variable can
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
86 be made buffer-local.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
87
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
88 If the value of this variable is `nil', then function `ding' is
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
89 called to beep or flash the screen when points are mismatched."
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
90 :type '(choice regexp function)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
91 :group 'compare-w)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
92
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
93 (defcustom compare-windows-sync-string-size 32
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
94 "*Size of string from one window that is searched in second window.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
95
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
96 Small number makes difference regions more fine-grained, but it
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
97 may fail by finding the wrong match. The bigger number makes
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
98 difference regions more coarse-grained.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
99
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
100 The default value 32 is good for the most cases."
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
101 :type 'integer
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
102 :group 'compare-w)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
103
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
104 (defcustom compare-windows-recenter nil
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
105 "*List of two values, each of which is used as argument of
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
106 function `recenter' called in each of two windows to place
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
107 matching points side-by-side.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
108
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
109 The value `(-1 0)' is useful if windows are split vertically,
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
110 and the value `((4) (4))' for horizontally split windows."
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
111 :type '(list sexp sexp)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
112 :group 'compare-w)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
113
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
114 (defcustom compare-windows-highlight t
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
115 "*Non-nil means compare-windows highlights the differences."
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
116 :type 'boolean
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
117 :group 'compare-w)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
118
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
119 (defface compare-windows-face
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
120 '((((type tty pc) (class color))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
121 (:background "turquoise3"))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
122 (((class color) (background light))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
123 (:background "paleturquoise"))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
124 (((class color) (background dark))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
125 (:background "paleturquoise4"))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
126 (t (:underline t)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
127 "Face for highlighting of compare-windows difference regions."
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
128 :group 'compare-w)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
129
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
130 (defvar compare-windows-overlay1 nil)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
131 (defvar compare-windows-overlay2 nil)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
132 (defvar compare-windows-sync-point nil)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
133
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134 ;;;###autoload
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
135 (defun compare-windows (ignore-whitespace)
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
136 "Compare text in current window with text in next window.
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137 Compares the text starting at point in each window,
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138 moving over text in each one as far as they match.
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139
10031
324e027f01bc (compare-windows): Push mark in both buffers at start.
Richard M. Stallman <rms@gnu.org>
parents: 7701
diff changeset
140 This command pushes the mark in each window
324e027f01bc (compare-windows): Push mark in both buffers at start.
Richard M. Stallman <rms@gnu.org>
parents: 7701
diff changeset
141 at the prior location of point in that window.
324e027f01bc (compare-windows): Push mark in both buffers at start.
Richard M. Stallman <rms@gnu.org>
parents: 7701
diff changeset
142 If both windows display the same buffer,
324e027f01bc (compare-windows): Push mark in both buffers at start.
Richard M. Stallman <rms@gnu.org>
parents: 7701
diff changeset
143 the mark is pushed twice in that buffer:
324e027f01bc (compare-windows): Push mark in both buffers at start.
Richard M. Stallman <rms@gnu.org>
parents: 7701
diff changeset
144 first in the other window, then in the selected window.
324e027f01bc (compare-windows): Push mark in both buffers at start.
Richard M. Stallman <rms@gnu.org>
parents: 7701
diff changeset
145
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
146 A prefix arg means reverse the value of variable
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
147 `compare-ignore-whitespace'. If `compare-ignore-whitespace' is
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
148 nil, then a prefix arg means ignore changes in whitespace. If
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
149 `compare-ignore-whitespace' is non-nil, then a prefix arg means
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
150 don't ignore changes in whitespace. The variable
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
151 `compare-windows-whitespace' controls how whitespace is skipped.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
152 If `compare-ignore-case' is non-nil, changes in case are also
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
153 ignored.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
154
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
155 If `compare-windows-sync' is non-nil, then successive calls of
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
156 this command work in interlaced mode:
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
157 on first call it advances points to the next difference,
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
158 on second call it synchronizes points by skipping the difference,
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
159 on third call it again advances points to the next difference and so on."
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
160 (interactive "P")
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
161 (let* (p1 p2 maxp1 maxp2 b1 b2 w2
16986
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
162 (progress 1)
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
163 (opoint1 (point))
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
164 opoint2
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
165 (skip-func (if (if ignore-whitespace ; XOR
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
166 (not compare-ignore-whitespace)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
167 compare-ignore-whitespace)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
168 (if (stringp compare-windows-whitespace)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
169 'compare-windows-skip-whitespace
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
170 compare-windows-whitespace)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
171 (sync-func (if (stringp compare-windows-sync)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
172 'compare-windows-sync-regexp
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
173 compare-windows-sync)))
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
174 (setq p1 (point) b1 (current-buffer))
24948
970c0b904d35 (compare-windows): Try to find the next window in
Andreas Schwab <schwab@suse.de>
parents: 21088
diff changeset
175 (setq w2 (next-window (selected-window)))
970c0b904d35 (compare-windows): Try to find the next window in
Andreas Schwab <schwab@suse.de>
parents: 21088
diff changeset
176 (if (eq w2 (selected-window))
970c0b904d35 (compare-windows): Try to find the next window in
Andreas Schwab <schwab@suse.de>
parents: 21088
diff changeset
177 (setq w2 (next-window (selected-window) nil 'visible)))
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
178 (if (eq w2 (selected-window))
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
179 (error "No other window"))
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180 (setq p2 (window-point w2)
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
181 b2 (window-buffer w2))
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
182 (setq opoint2 p2)
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
183 (setq maxp1 (point-max))
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
184 (save-excursion
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
185 (set-buffer b2)
10031
324e027f01bc (compare-windows): Push mark in both buffers at start.
Richard M. Stallman <rms@gnu.org>
parents: 7701
diff changeset
186 (push-mark p2 t)
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
187 (setq maxp2 (point-max)))
10031
324e027f01bc (compare-windows): Push mark in both buffers at start.
Richard M. Stallman <rms@gnu.org>
parents: 7701
diff changeset
188 (push-mark)
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189
16986
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
190 (while (> progress 0)
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
191 ;; If both windows have whitespace next to point,
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192 ;; optionally skip over it.
16986
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
193 (and skip-func
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
194 (save-excursion
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
195 (let (p1a p2a w1 w2 result1 result2)
16986
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
196 (setq result1 (funcall skip-func opoint1))
4072
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
197 (setq p1a (point))
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
198 (set-buffer b2)
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
199 (goto-char p2)
16986
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
200 (setq result2 (funcall skip-func opoint2))
4072
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
201 (setq p2a (point))
16987
433d9754cdd5 Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents: 16986
diff changeset
202 (if (or (stringp compare-windows-whitespace)
7701
ec15948b9458 (compare-windows): Make leading whitespace equivalent
Richard M. Stallman <rms@gnu.org>
parents: 5005
diff changeset
203 (and result1 result2 (eq result1 result2)))
ec15948b9458 (compare-windows): Make leading whitespace equivalent
Richard M. Stallman <rms@gnu.org>
parents: 5005
diff changeset
204 (setq p1 p1a
ec15948b9458 (compare-windows): Make leading whitespace equivalent
Richard M. Stallman <rms@gnu.org>
parents: 5005
diff changeset
205 p2 p2a)))))
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
206
16986
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
207 (let ((size (min (- maxp1 p1) (- maxp2 p2)))
2011
eea183a35396 (compare-windows): Use compare-buffer-substrings.
Richard M. Stallman <rms@gnu.org>
parents: 845
diff changeset
208 (case-fold-search compare-ignore-case))
16986
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
209 (setq progress (compare-buffer-substrings b2 p2 (+ size p2)
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
210 b1 p1 (+ size p1)))
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
211 (setq progress (if (zerop progress) size (1- (abs progress))))
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
212 (setq p1 (+ p1 progress) p2 (+ p2 progress)))
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
213 ;; Advance point now rather than later, in case we're interrupted.
dc0cd1c70c87 (compare-windows): Make more efficient use of
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
214 (goto-char p1)
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
215 (set-window-point w2 p2)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
216 (when compare-windows-recenter
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
217 (recenter (car compare-windows-recenter))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
218 (with-selected-window w2 (recenter (cadr compare-windows-recenter)))))
257
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
219
e5ba2ba35226 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
220 (if (= (point) opoint1)
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
221 (if (not sync-func)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
222 (ding)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
223 ;; If points are not advanced (i.e. already on mismatch position),
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
224 ;; then synchronize points between both windows
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
225 (save-excursion
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
226 (setq compare-windows-sync-point nil)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
227 (funcall sync-func)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
228 (setq p1 (point))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
229 (set-buffer b2)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
230 (goto-char p2)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
231 (funcall sync-func)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
232 (setq p2 (point)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
233 (goto-char p1)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
234 (set-window-point w2 p2)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
235 (when compare-windows-recenter
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
236 (recenter (car compare-windows-recenter))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
237 (with-selected-window w2 (recenter (cadr compare-windows-recenter))))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
238 ;; If points are still not synchronized, then ding
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
239 (when (and (= p1 opoint1) (= p2 opoint2))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
240 ;; Display error message when current points in two windows
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
241 ;; are unmatched and next matching points can't be found.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
242 (compare-windows-dehighlight)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
243 (ding)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
244 (message "No more matching points"))))))
584
4cd7543be581 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 257
diff changeset
245
4072
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
246 ;; Move forward over whatever might be called whitespace.
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
247 ;; compare-windows-whitespace is a regexp that matches whitespace.
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
248 ;; Match it at various starting points before the original point
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
249 ;; and find the latest point at which a match ends.
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
250 ;; Don't try starting points before START, though.
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
251 ;; Value is non-nil if whitespace is found.
4925
76fb8b35df3f (compare-windows-skip-whitespace): Return t
Richard M. Stallman <rms@gnu.org>
parents: 4072
diff changeset
252 ;; If there is whitespace before point, but none after,
76fb8b35df3f (compare-windows-skip-whitespace): Return t
Richard M. Stallman <rms@gnu.org>
parents: 4072
diff changeset
253 ;; then return t, but don't advance point.
4072
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
254 (defun compare-windows-skip-whitespace (start)
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
255 (let ((end (point))
4925
76fb8b35df3f (compare-windows-skip-whitespace): Return t
Richard M. Stallman <rms@gnu.org>
parents: 4072
diff changeset
256 (beg (point))
4072
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
257 (opoint (point)))
5005
c762abae3964 (compare-windows-skip-whitespace): Swap the two
Richard M. Stallman <rms@gnu.org>
parents: 4925
diff changeset
258 (while (or (and (looking-at compare-windows-whitespace)
4925
76fb8b35df3f (compare-windows-skip-whitespace): Return t
Richard M. Stallman <rms@gnu.org>
parents: 4072
diff changeset
259 (<= end (match-end 0))
76fb8b35df3f (compare-windows-skip-whitespace): Return t
Richard M. Stallman <rms@gnu.org>
parents: 4072
diff changeset
260 ;; This match goes past END, so advance END.
76fb8b35df3f (compare-windows-skip-whitespace): Return t
Richard M. Stallman <rms@gnu.org>
parents: 4072
diff changeset
261 (progn (setq end (match-end 0))
5005
c762abae3964 (compare-windows-skip-whitespace): Swap the two
Richard M. Stallman <rms@gnu.org>
parents: 4925
diff changeset
262 (> (point) start)))
c762abae3964 (compare-windows-skip-whitespace): Swap the two
Richard M. Stallman <rms@gnu.org>
parents: 4925
diff changeset
263 (and (/= (point) start)
c762abae3964 (compare-windows-skip-whitespace): Swap the two
Richard M. Stallman <rms@gnu.org>
parents: 4925
diff changeset
264 ;; Consider at least the char before point,
c762abae3964 (compare-windows-skip-whitespace): Swap the two
Richard M. Stallman <rms@gnu.org>
parents: 4925
diff changeset
265 ;; unless it is also before START.
c762abae3964 (compare-windows-skip-whitespace): Swap the two
Richard M. Stallman <rms@gnu.org>
parents: 4925
diff changeset
266 (= (point) opoint)))
4072
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
267 ;; keep going back until whitespace
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
268 ;; doesn't extend to or past end
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
269 (forward-char -1))
4925
76fb8b35df3f (compare-windows-skip-whitespace): Return t
Richard M. Stallman <rms@gnu.org>
parents: 4072
diff changeset
270 (setq beg (point))
4072
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
271 (goto-char end)
4925
76fb8b35df3f (compare-windows-skip-whitespace): Return t
Richard M. Stallman <rms@gnu.org>
parents: 4072
diff changeset
272 (or (/= beg opoint)
76fb8b35df3f (compare-windows-skip-whitespace): Return t
Richard M. Stallman <rms@gnu.org>
parents: 4072
diff changeset
273 (/= end opoint))))
4072
d38c94145afe (compare-windows-skip-whitespace): New function.
Richard M. Stallman <rms@gnu.org>
parents: 2307
diff changeset
274
52893
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
275 ;; Move forward to the next synchronization regexp.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
276 (defun compare-windows-sync-regexp ()
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
277 (if (stringp compare-windows-sync)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
278 (re-search-forward compare-windows-sync nil t)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
279
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
280 ;; Function works in two passes: one call on each window.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
281 ;; On the first call both matching points are computed,
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
282 ;; and one of them is stored in compare-windows-sync-point
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
283 ;; to be used when this function is called on second window.
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
284 (defun compare-windows-sync-default-function ()
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
285 (if (not compare-windows-sync-point)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
286 (let* ((w2 (next-window (selected-window)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
287 (b2 (window-buffer w2))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
288 (point-max2 (with-current-buffer b2 (point-max)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
289 (op2 (window-point w2))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
290 (op1 (point))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
291 (region-size compare-windows-sync-string-size)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
292 (string-size compare-windows-sync-string-size)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
293 in-bounds-p s1 p2 p12s p12)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
294 (while (and
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
295 ;; until matching points are found
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
296 (not p12s)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
297 ;; until size exceeds the maximum points of both buffers
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
298 ;; (bounds below take care to not overdo in each of them)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
299 (or (setq in-bounds-p (< region-size (max (- (point-max) op1)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
300 (- point-max2 op2))))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
301 ;; until string size becomes smaller than 4
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
302 (> string-size 4)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
303 (if in-bounds-p
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
304 ;; make the next search in the double-sized region;
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
305 ;; on first iteration it is 2*compare-windows-sync-string-size,
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
306 ;; on last iterations it exceeds both buffers maximum points
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
307 (setq region-size (* region-size 2))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
308 ;; if region size exceeds the maximum points of both buffers,
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
309 ;; then start to halve the string size until 4;
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
310 ;; this helps to find differences near the end of buffers
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
311 (setq string-size (/ string-size 2)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
312 (let ((p1 op1)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
313 (bound1 (- (min (+ op1 region-size) (point-max)) string-size))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
314 (bound2 (min (+ op2 region-size) point-max2)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
315 (while (< p1 bound1)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
316 (setq s1 (buffer-substring-no-properties p1 (+ p1 string-size)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
317 (setq p2 (with-current-buffer b2
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
318 (goto-char op2)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
319 (let ((case-fold-search compare-ignore-case))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
320 (search-forward s1 bound2 t))))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
321 (when p2
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
322 (setq p2 (- p2 string-size))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
323 (setq p12s (cons (list (+ p1 p2) p1 p2) p12s)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
324 (setq p1 (1+ p1)))))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
325 (when p12s
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
326 ;; use closest matching points (i.e. points with minimal sum)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
327 (setq p12 (cdr (assq (apply 'min (mapcar 'car p12s)) p12s)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
328 (goto-char (car p12))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
329 (compare-windows-highlight op1 (car p12) op2 (cadr p12) b2))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
330 (setq compare-windows-sync-point (or (cadr p12) t)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
331 ;; else set point in the second window to the pre-calculated value
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
332 (if (numberp compare-windows-sync-point)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
333 (goto-char compare-windows-sync-point))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
334 (setq compare-windows-sync-point nil)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
335
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
336 ;; Highlight differences
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
337 (defun compare-windows-highlight (beg1 end1 beg2 end2 buf2)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
338 (when compare-windows-highlight
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
339 (if compare-windows-overlay1
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
340 (move-overlay compare-windows-overlay1 beg1 end1 (current-buffer))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
341 (setq compare-windows-overlay1 (make-overlay beg1 end1 (current-buffer)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
342 (overlay-put compare-windows-overlay1 'face 'compare-windows-face)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
343 (overlay-put compare-windows-overlay1 'priority 1))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
344 (if compare-windows-overlay2
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
345 (move-overlay compare-windows-overlay2 beg2 end2 buf2)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
346 (setq compare-windows-overlay2 (make-overlay beg2 end2 buf2))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
347 (overlay-put compare-windows-overlay2 'face 'compare-windows-face)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
348 (overlay-put compare-windows-overlay2 'priority 1))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
349 ;; Remove highlighting before next command is executed
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
350 (add-hook 'pre-command-hook 'compare-windows-dehighlight)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
351
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
352 (defun compare-windows-dehighlight ()
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
353 "Remove highlighting created by `compare-windows-highlight'."
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
354 (interactive)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
355 (remove-hook 'pre-command-hook 'compare-windows-dehighlight)
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
356 (and compare-windows-overlay1 (delete-overlay compare-windows-overlay1))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
357 (and compare-windows-overlay2 (delete-overlay compare-windows-overlay2)))
a8714ce78ab1 (compare-windows-whitespace): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 52401
diff changeset
358
584
4cd7543be581 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 257
diff changeset
359 (provide 'compare-w)
4cd7543be581 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 257
diff changeset
360
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 46405
diff changeset
361 ;;; arch-tag: 4177aab1-48e6-4a98-b7a1-000ee285de46
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 584
diff changeset
362 ;;; compare-w.el ends here