Mercurial > emacs
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 |
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 | 4 |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
5 ;; Maintainer: FSF |
45078 | 6 ;; Keywords: convenience files |
257 | 7 |
8 ;; This file is part of GNU Emacs. | |
9 | |
10 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
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 | 13 ;; any later version. |
14 | |
15 ;; GNU Emacs is distributed in the hope that it will be useful, | |
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 ;; GNU General Public License for more details. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
14169 | 21 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
23 ;; Boston, MA 02111-1307, USA. | |
257 | 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 | 34 (defgroup compare-w nil |
35 "Compare text between windows." | |
36 :prefix "compare-" | |
37 :group 'tools) | |
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 | 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 | 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 | 52 whitespace is considered to match, and is skipped." |
53 :type '(choice regexp function) | |
54 :group 'compare-w) | |
257 | 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 | 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 | 63 :type 'boolean |
64 :group 'compare-w) | |
257 | 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 | 134 ;;;###autoload |
135 (defun compare-windows (ignore-whitespace) | |
136 "Compare text in current window with text in next window. | |
137 Compares the text starting at point in each window, | |
138 moving over text in each one as far as they match. | |
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 | 160 (interactive "P") |
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 | 163 (opoint1 (point)) |
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 | 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 | 178 (if (eq w2 (selected-window)) |
179 (error "No other window")) | |
180 (setq p2 (window-point w2) | |
181 b2 (window-buffer w2)) | |
182 (setq opoint2 p2) | |
183 (setq maxp1 (point-max)) | |
184 (save-excursion | |
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 | 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 | 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 | 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 | 194 (save-excursion |
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 | 198 (set-buffer b2) |
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 | 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 | 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 | 219 |
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 | 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 | 359 (provide 'compare-w) |
360 | |
52401 | 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 |