Mercurial > emacs
annotate lisp/diff.el @ 38212:6b14cc47a4f2
Major rewrite. Sections Tags, Emerge, Change Log and Authors
moved to maintaining.texi. Some sections reordered.
Node Misc for Programs moved to just before the language-specific sections.
New node Defuns contains an intro plus the old
Defuns node (now renamed Moving by Defuns)
as well as Imenu, Which Function, and a node
Left Margin Paren to explain the convention about this.
New node Parentheses now documents M-x check-parens.
It contains subnodes Expressions, Moving by Parens, and Matching.
Expressions and Moving by Parens contain the material
formerly in Lists and List Commands, but divided up differently.
The section Balanced Editing has been deleted.
Most of the C indentation customization (all except c-set-style),
has been replaced with a reference to the C Modes manual.
Documentation now is divided into three subsections.
Some rewrites in the Program Indent section about
C-u TAB and C-M-q.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Tue, 26 Jun 2001 13:43:32 +0000 |
parents | c23f7efbfd57 |
children | 67b464da13ec |
rev | line source |
---|---|
894 | 1 ;;; diff.el --- Run `diff' in compilation-mode. |
846
20674ae6bf52
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
811
diff
changeset
|
2 |
14140
db5e78740d5c
(diff): Fix local compilation-exit-message-function to take the proper
Roland McGrath <roland@gnu.org>
parents:
14106
diff
changeset
|
3 ;; Copyright (C) 1992, 1994, 1996 Free Software Foundation, Inc. |
894 | 4 |
2247
2c7997f249eb
Add or correct keywords
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1215
diff
changeset
|
5 ;; Keywords: unix, tools |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
669
diff
changeset
|
6 |
349 | 7 ;; This file is part of GNU Emacs. |
8 | |
9 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
10 ;; 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:
669
diff
changeset
|
11 ;; the Free Software Foundation; either version 2, or (at your option) |
349 | 12 ;; any later version. |
13 | |
14 ;; GNU Emacs is distributed in the hope that it will be useful, | |
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 ;; GNU General Public License for more details. | |
18 | |
19 ;; You should have received a copy of the GNU General Public License | |
14169 | 20 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
22 ;; Boston, MA 02111-1307, USA. | |
349 | 23 |
2307
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2247
diff
changeset
|
24 ;;; Commentary: |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2247
diff
changeset
|
25 |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2247
diff
changeset
|
26 ;; This package helps you explore differences between files, using the |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2247
diff
changeset
|
27 ;; UNIX command diff(1). The commands are `diff' and `diff-backup'. |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2247
diff
changeset
|
28 ;; You can specify options with `diff-switches'. |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2247
diff
changeset
|
29 |
894 | 30 ;;; Code: |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
669
diff
changeset
|
31 |
894 | 32 (require 'compile) |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
669
diff
changeset
|
33 |
18143 | 34 (defgroup diff nil |
35 "Comparing files with `diff'." | |
36 :group 'tools) | |
894 | 37 |
18143 | 38 ;;;###autoload |
39 (defcustom diff-switches "-c" | |
40 "*A string or list of strings specifying switches to be be passed to diff." | |
41 :type '(choice string (repeat string)) | |
42 :group 'diff) | |
43 | |
44 ;;;###autoload | |
45 (defcustom diff-command "diff" | |
46 "*The command to use to run diff." | |
18150
960597385f1c
(diff-command): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
18143
diff
changeset
|
47 :type 'string |
18143 | 48 :group 'diff) |
9736
093d80b4ae17
(diff-command): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
8195
diff
changeset
|
49 |
894 | 50 (defvar diff-regexp-alist |
51 '( | |
52 ;; -u format: @@ -OLDSTART,OLDEND +NEWSTART,NEWEND @@ | |
53 ("^@@ -\\([0-9]+\\),[0-9]+ \\+\\([0-9]+\\),[0-9]+ @@$" 1 2) | |
14140
db5e78740d5c
(diff): Fix local compilation-exit-message-function to take the proper
Roland McGrath <roland@gnu.org>
parents:
14106
diff
changeset
|
54 |
894 | 55 ;; -c format: *** OLDSTART,OLDEND **** |
56 ("^\\*\\*\\* \\([0-9]+\\),[0-9]+ \\*\\*\\*\\*$" 1 nil) | |
57 ;; --- NEWSTART,NEWEND ---- | |
58 ("^--- \\([0-9]+\\),[0-9]+ ----$" nil 1) | |
59 | |
60 ;; plain diff format: OLDSTART[,OLDEND]{a,d,c}NEWSTART[,NEWEND] | |
61 ("^\\([0-9]+\\)\\(,[0-9]+\\)?[adc]\\([0-9]+\\)\\(,[0-9]+\\)?$" 1 3) | |
62 | |
63 ;; -e (ed) format: OLDSTART[,OLDEND]{a,d,c} | |
64 ("^\\([0-9]+\\)\\(,[0-9]+\\)?[adc]$" 1) | |
349 | 65 |
894 | 66 ;; -f format: {a,d,c}OLDSTART[ OLDEND] |
67 ;; -n format: {a,d,c}OLDSTART LINES-CHANGED | |
68 ("^[adc]\\([0-9]+\\)\\( [0-9]+\\)?$" 1) | |
69 ) | |
14140
db5e78740d5c
(diff): Fix local compilation-exit-message-function to take the proper
Roland McGrath <roland@gnu.org>
parents:
14106
diff
changeset
|
70 "Alist (REGEXP OLD-IDX NEW-IDX) of regular expressions to match difference |
894 | 71 sections in \\[diff] output. If REGEXP matches, the OLD-IDX'th |
72 subexpression gives the line number in the old file, and NEW-IDX'th | |
73 subexpression gives the line number in the new file. If OLD-IDX or NEW-IDX | |
74 is nil, REGEXP matches only half a section.") | |
349 | 75 |
1134
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
76 (defvar diff-old-file nil |
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
77 "This is the old file name in the comparison in this buffer.") |
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
78 (defvar diff-new-file nil |
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
79 "This is the new file name in the comparison in this buffer.") |
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
80 (defvar diff-old-temp-file nil |
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
81 "This is the name of a temp file to be deleted after diff finishes.") |
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
82 (defvar diff-new-temp-file nil |
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
83 "This is the name of a temp file to be deleted after diff finishes.") |
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
84 |
894 | 85 ;; See compilation-parse-errors-function (compile.el). |
907 | 86 (defun diff-parse-differences (limit-search find-at-least) |
894 | 87 (setq compilation-error-list nil) |
88 (message "Parsing differences...") | |
89 | |
90 ;; Don't reparse diffs already seen at last parse. | |
2541
09e58f572f19
(diff-parse-differences): Small robustification --- don't lose if we
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2307
diff
changeset
|
91 (if compilation-parsing-end (goto-char compilation-parsing-end)) |
474 | 92 |
894 | 93 ;; Construct in REGEXP a regexp composed of all those in dired-regexp-alist. |
94 (let ((regexp (mapconcat (lambda (elt) | |
95 (concat "\\(" (car elt) "\\)")) | |
96 diff-regexp-alist | |
97 "\\|")) | |
98 ;; (GROUP-IDX OLD-IDX NEW-IDX) | |
99 (groups (let ((subexpr 1)) | |
100 (mapcar (lambda (elt) | |
101 (prog1 | |
102 (cons subexpr | |
103 (mapcar (lambda (n) | |
104 (and n | |
105 (+ subexpr n))) | |
106 (cdr elt))) | |
107 (setq subexpr (+ subexpr 1 | |
108 (count-regexp-groupings | |
109 (car elt)))))) | |
110 diff-regexp-alist))) | |
111 | |
112 (new-error | |
113 (function (lambda (file subexpr) | |
114 (setq compilation-error-list | |
115 (cons | |
1179 | 116 (cons (save-excursion |
117 ;; Report location of message | |
118 ;; at beginning of line. | |
119 (goto-char | |
120 (match-beginning subexpr)) | |
121 (beginning-of-line) | |
122 (point-marker)) | |
123 ;; Report location of corresponding text. | |
894 | 124 (let ((line (string-to-int |
125 (buffer-substring | |
126 (match-beginning subexpr) | |
127 (match-end subexpr))))) | |
128 (save-excursion | |
3874
0a694f8e1730
* diff.el (diff-parse-differences): Preserve the match data
Jim Blandy <jimb@redhat.com>
parents:
3429
diff
changeset
|
129 (save-match-data |
0a694f8e1730
* diff.el (diff-parse-differences): Preserve the match data
Jim Blandy <jimb@redhat.com>
parents:
3429
diff
changeset
|
130 (set-buffer (find-file-noselect file))) |
894 | 131 (save-excursion |
132 (goto-line line) | |
133 (point-marker))))) | |
134 compilation-error-list))))) | |
135 | |
136 (found-desired nil) | |
1215
92554bb95d51
(diff): Don't print echo area message.
Richard M. Stallman <rms@gnu.org>
parents:
1179
diff
changeset
|
137 (num-loci-found 0) |
894 | 138 g) |
139 | |
140 (while (and (not found-desired) | |
141 ;; We don't just pass LIMIT-SEARCH to re-search-forward | |
142 ;; because we want to find matches containing LIMIT-SEARCH | |
143 ;; but which extend past it. | |
144 (re-search-forward regexp nil t)) | |
145 | |
146 ;; Find which individual regexp matched. | |
147 (setq g groups) | |
148 (while (and g (null (match-beginning (car (car g))))) | |
149 (setq g (cdr g))) | |
150 (setq g (car g)) | |
151 | |
152 (if (nth 1 g) ;OLD-IDX | |
153 (funcall new-error diff-old-file (nth 1 g))) | |
154 (if (nth 2 g) ;NEW-IDX | |
155 (funcall new-error diff-new-file (nth 2 g))) | |
156 | |
1215
92554bb95d51
(diff): Don't print echo area message.
Richard M. Stallman <rms@gnu.org>
parents:
1179
diff
changeset
|
157 (setq num-loci-found (1+ num-loci-found)) |
1134
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
158 (if (or (and find-at-least |
1215
92554bb95d51
(diff): Don't print echo area message.
Richard M. Stallman <rms@gnu.org>
parents:
1179
diff
changeset
|
159 (>= num-loci-found find-at-least)) |
907 | 160 (and limit-search (>= (point) limit-search))) |
1215
92554bb95d51
(diff): Don't print echo area message.
Richard M. Stallman <rms@gnu.org>
parents:
1179
diff
changeset
|
161 ;; We have found as many new loci as the user wants, |
907 | 162 ;; or the user wanted a specific diff, and we're past it. |
163 (setq found-desired t))) | |
25413
c23f7efbfd57
(diff-parse-differences):
Richard M. Stallman <rms@gnu.org>
parents:
19836
diff
changeset
|
164 (set-marker compilation-parsing-end |
c23f7efbfd57
(diff-parse-differences):
Richard M. Stallman <rms@gnu.org>
parents:
19836
diff
changeset
|
165 (if found-desired (point) |
c23f7efbfd57
(diff-parse-differences):
Richard M. Stallman <rms@gnu.org>
parents:
19836
diff
changeset
|
166 ;; Set to point-max, not point, so we don't perpetually |
c23f7efbfd57
(diff-parse-differences):
Richard M. Stallman <rms@gnu.org>
parents:
19836
diff
changeset
|
167 ;; parse the last bit of text when it isn't a diff header. |
c23f7efbfd57
(diff-parse-differences):
Richard M. Stallman <rms@gnu.org>
parents:
19836
diff
changeset
|
168 (point-max))) |
1215
92554bb95d51
(diff): Don't print echo area message.
Richard M. Stallman <rms@gnu.org>
parents:
1179
diff
changeset
|
169 (message "Parsing differences...done")) |
894 | 170 (setq compilation-error-list (nreverse compilation-error-list))) |
349 | 171 |
16984
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
172 (defun diff-process-setup () |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
173 "Set up \`compilation-exit-message-function' for \`diff'." |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
174 ;; Avoid frightening people with "abnormally terminated" |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
175 ;; if diff finds differences. |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
176 (set (make-local-variable 'compilation-exit-message-function) |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
177 (lambda (status code msg) |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
178 (cond ((not (eq status 'exit)) |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
179 (cons msg code)) |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
180 ((zerop code) |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
181 '("finished (no differences)\n" . "no differences")) |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
182 ((= code 1) |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
183 '("finished\n" . "differences found")) |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
184 (t |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
185 (cons msg code)))))) |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
186 |
349 | 187 ;;;###autoload |
894 | 188 (defun diff (old new &optional switches) |
349 | 189 "Find and display the differences between OLD and NEW files. |
4759 | 190 Interactively the current buffer's file name is the default for NEW |
894 | 191 and a backup file for NEW is the default for OLD. |
192 With prefix arg, prompt for diff switches." | |
349 | 193 (interactive |
894 | 194 (nconc |
195 (let (oldf newf) | |
196 (nreverse | |
197 (list | |
198 (setq newf (buffer-file-name) | |
199 newf (if (and newf (file-exists-p newf)) | |
200 (read-file-name | |
201 (concat "Diff new file: (" | |
202 (file-name-nondirectory newf) ") ") | |
203 nil newf t) | |
204 (read-file-name "Diff new file: " nil nil t))) | |
205 (setq oldf (file-newest-backup newf) | |
206 oldf (if (and oldf (file-exists-p oldf)) | |
207 (read-file-name | |
208 (concat "Diff original file: (" | |
209 (file-name-nondirectory oldf) ") ") | |
210 (file-name-directory oldf) oldf t) | |
211 (read-file-name "Diff original file: " | |
212 (file-name-directory newf) nil t)))))) | |
213 (if current-prefix-arg | |
214 (list (read-string "Diff switches: " | |
215 (if (stringp diff-switches) | |
216 diff-switches | |
217 (mapconcat 'identity diff-switches " ")))) | |
218 nil))) | |
349 | 219 (setq new (expand-file-name new) |
220 old (expand-file-name old)) | |
1134
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
221 (let ((old-alt (file-local-copy old)) |
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
222 (new-alt (file-local-copy new)) |
1110
f165d900e06e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
907
diff
changeset
|
223 buf) |
15932
e4d0cf418b2b
(diff): Don't pop to *diff* buffer. Change bogus
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
224 (save-excursion |
16984
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
225 (let ((compilation-process-setup-function 'diff-process-setup) |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
226 (command |
1110
f165d900e06e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
907
diff
changeset
|
227 (mapconcat 'identity |
9736
093d80b4ae17
(diff-command): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
8195
diff
changeset
|
228 (append (list diff-command) |
3429
5c0a40a8a55d
(diff): Really do use arg SWITCHES.
Richard M. Stallman <rms@gnu.org>
parents:
2704
diff
changeset
|
229 ;; Use explicitly specified switches |
5c0a40a8a55d
(diff): Really do use arg SWITCHES.
Richard M. Stallman <rms@gnu.org>
parents:
2704
diff
changeset
|
230 (if switches |
5c0a40a8a55d
(diff): Really do use arg SWITCHES.
Richard M. Stallman <rms@gnu.org>
parents:
2704
diff
changeset
|
231 (if (consp switches) |
5c0a40a8a55d
(diff): Really do use arg SWITCHES.
Richard M. Stallman <rms@gnu.org>
parents:
2704
diff
changeset
|
232 switches (list switches)) |
5c0a40a8a55d
(diff): Really do use arg SWITCHES.
Richard M. Stallman <rms@gnu.org>
parents:
2704
diff
changeset
|
233 ;; If not specified, use default. |
5c0a40a8a55d
(diff): Really do use arg SWITCHES.
Richard M. Stallman <rms@gnu.org>
parents:
2704
diff
changeset
|
234 (if (consp diff-switches) |
5c0a40a8a55d
(diff): Really do use arg SWITCHES.
Richard M. Stallman <rms@gnu.org>
parents:
2704
diff
changeset
|
235 diff-switches |
5c0a40a8a55d
(diff): Really do use arg SWITCHES.
Richard M. Stallman <rms@gnu.org>
parents:
2704
diff
changeset
|
236 (list diff-switches))) |
1110
f165d900e06e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
907
diff
changeset
|
237 (if (or old-alt new-alt) |
f165d900e06e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
907
diff
changeset
|
238 (list "-L" old "-L" new)) |
5386
a91748bee657
(diff): Call shell-quote-argument.
Richard M. Stallman <rms@gnu.org>
parents:
4759
diff
changeset
|
239 (list |
a91748bee657
(diff): Call shell-quote-argument.
Richard M. Stallman <rms@gnu.org>
parents:
4759
diff
changeset
|
240 (shell-quote-argument (or old-alt old))) |
a91748bee657
(diff): Call shell-quote-argument.
Richard M. Stallman <rms@gnu.org>
parents:
4759
diff
changeset
|
241 (list |
a91748bee657
(diff): Call shell-quote-argument.
Richard M. Stallman <rms@gnu.org>
parents:
4759
diff
changeset
|
242 (shell-quote-argument (or new-alt new)))) |
1110
f165d900e06e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
907
diff
changeset
|
243 " "))) |
f165d900e06e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
907
diff
changeset
|
244 (setq buf |
f165d900e06e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
907
diff
changeset
|
245 (compile-internal command |
f165d900e06e
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
907
diff
changeset
|
246 "No more differences" "Diff" |
1112 | 247 'diff-parse-differences)) |
15932
e4d0cf418b2b
(diff): Don't pop to *diff* buffer. Change bogus
Richard M. Stallman <rms@gnu.org>
parents:
14169
diff
changeset
|
248 (set-buffer buf) |
5542
004856d1b311
(diff): Select the differences buffer.
Richard M. Stallman <rms@gnu.org>
parents:
5541
diff
changeset
|
249 (set (make-local-variable 'diff-old-file) old) |
004856d1b311
(diff): Select the differences buffer.
Richard M. Stallman <rms@gnu.org>
parents:
5541
diff
changeset
|
250 (set (make-local-variable 'diff-new-file) new) |
004856d1b311
(diff): Select the differences buffer.
Richard M. Stallman <rms@gnu.org>
parents:
5541
diff
changeset
|
251 (set (make-local-variable 'diff-old-temp-file) old-alt) |
004856d1b311
(diff): Select the differences buffer.
Richard M. Stallman <rms@gnu.org>
parents:
5541
diff
changeset
|
252 (set (make-local-variable 'diff-new-temp-file) new-alt) |
004856d1b311
(diff): Select the differences buffer.
Richard M. Stallman <rms@gnu.org>
parents:
5541
diff
changeset
|
253 (set (make-local-variable 'compilation-finish-function) |
004856d1b311
(diff): Select the differences buffer.
Richard M. Stallman <rms@gnu.org>
parents:
5541
diff
changeset
|
254 (function (lambda (buff msg) |
004856d1b311
(diff): Select the differences buffer.
Richard M. Stallman <rms@gnu.org>
parents:
5541
diff
changeset
|
255 (if diff-old-temp-file |
004856d1b311
(diff): Select the differences buffer.
Richard M. Stallman <rms@gnu.org>
parents:
5541
diff
changeset
|
256 (delete-file diff-old-temp-file)) |
004856d1b311
(diff): Select the differences buffer.
Richard M. Stallman <rms@gnu.org>
parents:
5541
diff
changeset
|
257 (if diff-new-temp-file |
004856d1b311
(diff): Select the differences buffer.
Richard M. Stallman <rms@gnu.org>
parents:
5541
diff
changeset
|
258 (delete-file diff-new-temp-file))))) |
16984
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
259 ;; When async processes aren't available, the compilation finish |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
260 ;; function doesn't get chance to run. Invoke it by hand. |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
261 (or (fboundp 'start-process) |
100ef50c2c01
* (diff-process-setup): New function, sets up the
Eli Zaretskii <eliz@gnu.org>
parents:
15932
diff
changeset
|
262 (funcall compilation-finish-function nil nil)) |
1134
05c961416bb5
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
1112
diff
changeset
|
263 buf)))) |
474 | 264 |
894 | 265 ;;;###autoload |
266 (defun diff-backup (file &optional switches) | |
881
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
267 "Diff this file with its backup file or vice versa. |
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
268 Uses the latest backup, if there are several numerical backups. |
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
269 If this file is a backup, diff it with its original. |
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
270 The backup file is the first file given to `diff'." |
894 | 271 (interactive (list (read-file-name "Diff (file with backup): ") |
272 (if current-prefix-arg | |
273 (read-string "Diff switches: " | |
274 (if (stringp diff-switches) | |
275 diff-switches | |
276 (mapconcat 'identity | |
277 diff-switches " "))) | |
278 nil))) | |
881
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
279 (let (bak ori) |
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
280 (if (backup-file-name-p file) |
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
281 (setq bak file |
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
282 ori (file-name-sans-versions file)) |
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
283 (setq bak (or (diff-latest-backup-file file) |
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
284 (error "No backup found for %s" file)) |
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
285 ori file)) |
894 | 286 (diff bak ori switches))) |
474 | 287 |
881
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
288 (defun diff-latest-backup-file (fn) ; actually belongs into files.el |
945558e05127
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
846
diff
changeset
|
289 "Return the latest existing backup of FILE, or nil." |
7028
6915bf781a38
Pass operation to Ffind_file_name_handler.
Karl Heuer <kwzh@gnu.org>
parents:
6321
diff
changeset
|
290 (let ((handler (find-file-name-handler fn 'diff-latest-backup-file))) |
6147
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
291 (if handler |
6321
8c667dc4566e
(diff-latest-backup-file): Call file name handler properly.
Richard M. Stallman <rms@gnu.org>
parents:
6147
diff
changeset
|
292 (funcall handler 'diff-latest-backup-file fn) |
6147
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
293 ;; First try simple backup, then the highest numbered of the |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
294 ;; numbered backups. |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
295 ;; Ignore the value of version-control because we look for existing |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
296 ;; backups, which maybe were made earlier or by another user with |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
297 ;; a different value of version-control. |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
298 (setq fn (file-chase-links (expand-file-name fn))) |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
299 (or |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
300 (let ((bak (make-backup-file-name fn))) |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
301 (if (file-exists-p bak) bak)) |
8195
a4f0f421752e
(diff-latest-backup-file): Cope with backups stored
Richard M. Stallman <rms@gnu.org>
parents:
7028
diff
changeset
|
302 ;; We use BACKUPNAME to cope with backups stored in a different dir. |
a4f0f421752e
(diff-latest-backup-file): Cope with backups stored
Richard M. Stallman <rms@gnu.org>
parents:
7028
diff
changeset
|
303 (let* ((backupname (car (find-backup-file-name fn))) |
a4f0f421752e
(diff-latest-backup-file): Cope with backups stored
Richard M. Stallman <rms@gnu.org>
parents:
7028
diff
changeset
|
304 (dir (file-name-directory backupname)) |
a4f0f421752e
(diff-latest-backup-file): Cope with backups stored
Richard M. Stallman <rms@gnu.org>
parents:
7028
diff
changeset
|
305 (base-versions (concat (file-name-sans-versions |
a4f0f421752e
(diff-latest-backup-file): Cope with backups stored
Richard M. Stallman <rms@gnu.org>
parents:
7028
diff
changeset
|
306 (file-name-nondirectory backupname)) |
a4f0f421752e
(diff-latest-backup-file): Cope with backups stored
Richard M. Stallman <rms@gnu.org>
parents:
7028
diff
changeset
|
307 ".~")) |
17732
442b07348a34
(diff-latest-backup-file):
Richard M. Stallman <rms@gnu.org>
parents:
16984
diff
changeset
|
308 ;; This is a fluid var for backup-extract-version. |
442b07348a34
(diff-latest-backup-file):
Richard M. Stallman <rms@gnu.org>
parents:
16984
diff
changeset
|
309 (backup-extract-version-start (length base-versions))) |
6147
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
310 (concat dir |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
311 (car (sort |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
312 (file-name-all-completions base-versions dir) |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
313 (function |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
314 (lambda (fn1 fn2) |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
315 (> (backup-extract-version fn1) |
f89879182407
(diff-latest-backup-file): Check for a file-name-handler and run it.
Roland McGrath <roland@gnu.org>
parents:
5542
diff
changeset
|
316 (backup-extract-version fn2)))))))))))) |
474 | 317 |
2541
09e58f572f19
(diff-parse-differences): Small robustification --- don't lose if we
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2307
diff
changeset
|
318 (provide 'diff) |
09e58f572f19
(diff-parse-differences): Small robustification --- don't lose if we
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2307
diff
changeset
|
319 |
662
8a533acedb77
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
474
diff
changeset
|
320 ;;; diff.el ends here |