annotate lisp/diff-mode.el @ 78716:e49ff57b4ee8

*** empty log message ***
author Glenn Morris <rgm@gnu.org>
date Sun, 02 Sep 2007 01:28:32 +0000
parents b2023ab19990
children c41c1aee3d31
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42472
5787452daded Comment fixes.
Pavel Janík <Pavel@Janik.cz>
parents: 42455
diff changeset
1 ;;; diff-mode.el --- a mode for viewing/editing context diffs
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
2
64762
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64512
diff changeset
3 ;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
75191
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
4 ;; 2005, 2006, 2007 Free Software Foundation, Inc.
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
5
70292
2b77fa42947f Update my email address.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69608
diff changeset
6 ;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
42472
5787452daded Comment fixes.
Pavel Janík <Pavel@Janik.cz>
parents: 42455
diff changeset
7 ;; Keywords: convenience patch diff
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
8
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
10
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
78236
9355f9b7bbff Switch license to GPLv3 or later.
Glenn Morris <rgm@gnu.org>
parents: 76982
diff changeset
13 ;; the Free Software Foundation; either version 3, or (at your option)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
14 ;; any later version.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
15
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
19 ;; GNU General Public License for more details.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
20
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 64045
diff changeset
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 64045
diff changeset
24 ;; Boston, MA 02110-1301, USA.
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
25
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
26 ;;; Commentary:
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
27
35526
b40a6cecc4d5 (diff-mode): Disable preliminary support for `compile'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33488
diff changeset
28 ;; Provides support for font-lock, outline, navigation
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
29 ;; commands, editing and various conversions as well as jumping
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
30 ;; to the corresponding source file.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
31
53833
32e20bdb34c9 (diff-file-regexp-alist, diff-error-regexp-alist)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53782
diff changeset
32 ;; Inspired by Pavel Machek's patch-mode.el (<pavel@@atrey.karlin.mff.cuni.cz>)
42472
5787452daded Comment fixes.
Pavel Janík <Pavel@Janik.cz>
parents: 42455
diff changeset
33 ;; Some efforts were spent to have it somewhat compatible with XEmacs'
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
34 ;; diff-mode as well as with compilation-minor-mode
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
35
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
36 ;; Bugs:
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
37
30873
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
38 ;; - Reverse doesn't work with normal diffs.
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
39
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
40 ;; Todo:
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
41
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
42 ;; - Add a `delete-after-apply' so C-c C-a automatically deletes hunks.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
43 ;; Also allow C-c C-a to delete already-applied hunks.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
44 ;;
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
45 ;; - Try `diff <file> <hunk>' to try and fuzzily discover the source location
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
46 ;; of a hunk. Show then the changes between <file> and <hunk> and make it
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
47 ;; possible to apply them to <file>, <hunk-src>, or <hunk-dst>.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
48 ;; Or maybe just make it into a ".rej to diff3-markers converter".
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
49 ;; Maybe just use `wiggle' (by Neil Brown) to do it for us.
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
50 ;;
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
51 ;; - Refine hunk on a word-by-word basis.
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
52 ;;
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
53 ;; - in diff-apply-hunk, strip context in replace-match to better
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
54 ;; preserve markers and spacing.
30873
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
55 ;; - Handle `diff -b' output in context->unified.
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
56
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
57 ;;; Code:
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
58 (eval-when-compile (require 'cl))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
59
65287
0cf1480347a9 (add-log-buffer-file-name-function): Add defvar.
Juanma Barranquero <lekktu@gmail.com>
parents: 64762
diff changeset
60 (defvar add-log-buffer-file-name-function)
0cf1480347a9 (add-log-buffer-file-name-function): Add defvar.
Juanma Barranquero <lekktu@gmail.com>
parents: 64762
diff changeset
61
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
62
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
63 (defgroup diff-mode ()
64004
ea880752de3b (diff-mode): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 63415
diff changeset
64 "Major mode for viewing/editing diffs."
31269
64bb4634d6d8 (diff-mode) <defgroup>: Add :version.
Dave Love <fx@gnu.org>
parents: 30873
diff changeset
65 :version "21.1"
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
66 :group 'tools
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
67 :group 'diff)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
68
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
69 (defcustom diff-default-read-only nil
39386
50956864fe56 (diff-default-read-only): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39323
diff changeset
70 "If non-nil, `diff-mode' buffers default to being read-only."
50956864fe56 (diff-default-read-only): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39323
diff changeset
71 :type 'boolean
50956864fe56 (diff-default-read-only): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39323
diff changeset
72 :group 'diff-mode)
50956864fe56 (diff-default-read-only): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39323
diff changeset
73
37866
4e2d06e10072 (diff-jump-to-old-file, diff-update-on-the-fly):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37567
diff changeset
74 (defcustom diff-jump-to-old-file nil
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
75 "*Non-nil means `diff-goto-source' jumps to the old file.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
76 Else, it jumps to the new file."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61269
diff changeset
77 :type 'boolean
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61269
diff changeset
78 :group 'diff-mode)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
79
37866
4e2d06e10072 (diff-jump-to-old-file, diff-update-on-the-fly):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37567
diff changeset
80 (defcustom diff-update-on-the-fly t
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
81 "*Non-nil means hunk headers are kept up-to-date on-the-fly.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
82 When editing a diff file, the line numbers in the hunk headers
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
83 need to be kept consistent with the actual diff. This can
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
84 either be done on the fly (but this sometimes interacts poorly with the
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
85 undo mechanism) or whenever the file is written (can be slow
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
86 when editing big diffs)."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61269
diff changeset
87 :type 'boolean
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61269
diff changeset
88 :group 'diff-mode)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
89
32061
cdfabbe10a24 (diff-goto-source): Emit a status message.
Miles Bader <miles@gnu.org>
parents: 32012
diff changeset
90 (defcustom diff-advance-after-apply-hunk t
cdfabbe10a24 (diff-goto-source): Emit a status message.
Miles Bader <miles@gnu.org>
parents: 32012
diff changeset
91 "*Non-nil means `diff-apply-hunk' will move to the next hunk after applying."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61269
diff changeset
92 :type 'boolean
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61269
diff changeset
93 :group 'diff-mode)
32061
cdfabbe10a24 (diff-goto-source): Emit a status message.
Miles Bader <miles@gnu.org>
parents: 32012
diff changeset
94
cdfabbe10a24 (diff-goto-source): Emit a status message.
Miles Bader <miles@gnu.org>
parents: 32012
diff changeset
95
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
96 (defcustom diff-mode-hook nil
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
97 "Run after setting up the `diff-mode' major mode."
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
98 :type 'hook
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61269
diff changeset
99 :options '(diff-delete-empty-files diff-make-unified)
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61269
diff changeset
100 :group 'diff-mode)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
101
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
102 (defvar diff-outline-regexp
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
103 "\\([*+][*+][*+] [^0-9]\\|@@ ...\\|\\*\\*\\* [0-9].\\|--- [0-9]..\\)")
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
104
33432
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
105 ;;;;
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
106 ;;;; keymap, menu, ...
33432
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
107 ;;;;
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
108
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
109 (easy-mmode-defmap diff-mode-shared-map
30873
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
110 '(;; From Pavel Machek's patch-mode.
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
111 ("n" . diff-hunk-next)
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
112 ("N" . diff-file-next)
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
113 ("p" . diff-hunk-prev)
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
114 ("P" . diff-file-prev)
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
115 ("k" . diff-hunk-kill)
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
116 ("K" . diff-file-kill)
30873
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
117 ;; From compilation-minor-mode.
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
118 ("}" . diff-file-next)
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
119 ("{" . diff-file-prev)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
120 ("\C-m" . diff-goto-source)
54869
c491468e3c18 (diff-goto-source): Make it work for mouse bindings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54693
diff changeset
121 ([mouse-2] . diff-goto-source)
30873
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
122 ;; From XEmacs' diff-mode.
74269
fa6583f5269e (diff-mode-map): Add a binding for unified->context.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72813
diff changeset
123 ;; Standard M-w is useful, so don't change M-W.
fa6583f5269e (diff-mode-map): Add a binding for unified->context.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72813
diff changeset
124 ;;("W" . widen)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
125 ;;("." . diff-goto-source) ;display-buffer
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
126 ;;("f" . diff-goto-source) ;find-file
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
127 ("o" . diff-goto-source) ;other-window
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
128 ;;("w" . diff-goto-source) ;other-frame
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
129 ;;("N" . diff-narrow)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
130 ;;("h" . diff-show-header)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
131 ;;("j" . diff-show-difference) ;jump to Nth diff
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
132 ;;("q" . diff-quit)
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
133 ;; Not useful if you have to metafy them.
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
134 ;;(" " . scroll-up)
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
135 ;;("\177" . scroll-down)
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
136 ;; Standard M-a is useful, so don't change M-A.
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
137 ;;("A" . diff-ediff-patch)
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
138 ;; Standard M-r is useful, so don't change M-r or M-R.
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
139 ;;("r" . diff-restrict-view)
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
140 ;;("R" . diff-reverse-direction)
53782
12d228ede0dd Bind q to `quit-window'.
Benjamin Rutt <brutt@bloomington.in.us>
parents: 53058
diff changeset
141 ("q" . quit-window))
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
142 "Basic keymap for `diff-mode', bound to various prefix keys.")
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
143
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
144 (easy-mmode-defmap diff-mode-map
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
145 `(("\e" . ,diff-mode-shared-map)
30873
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
146 ;; From compilation-minor-mode.
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
147 ("\C-c\C-c" . diff-goto-source)
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
148 ;; Misc operations.
70333
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
149 ("\C-c\C-a" . diff-apply-hunk)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
150 ("\C-c\C-e" . diff-ediff-patch)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
151 ("\C-c\C-n" . diff-restrict-view)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
152 ("\C-c\C-r" . diff-reverse-direction)
33432
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
153 ("\C-c\C-s" . diff-split-hunk)
56919
34b22fc9d0ed (diff-mode-map): Bind toggle-next-error-follow-mode.
Eli Zaretskii <eliz@gnu.org>
parents: 56073
diff changeset
154 ("\C-c\C-t" . diff-test-hunk)
70333
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
155 ("\C-c\C-u" . diff-context->unified)
74269
fa6583f5269e (diff-mode-map): Add a binding for unified->context.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72813
diff changeset
156 ;; `d' because it duplicates the context :-( --Stef
fa6583f5269e (diff-mode-map): Add a binding for unified->context.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72813
diff changeset
157 ("\C-c\C-d" . diff-unified->context)
70333
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
158 ("\C-c\C-w" . diff-refine-hunk)
57020
f1329d47fa1a (diff-mode-map): Rename `next-error-follow-mode' to `next-error-follow-minor-mode'.
Juri Linkov <juri@jurta.org>
parents: 56919
diff changeset
159 ("\C-c\C-f" . next-error-follow-minor-mode))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
160 "Keymap for `diff-mode'. See also `diff-mode-shared-map'.")
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
161
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
162 (easy-menu-define diff-mode-menu diff-mode-map
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
163 "Menu for `diff-mode'."
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
164 '("Diff"
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
165 ["Jump to Source" diff-goto-source t]
33432
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
166 ["Apply hunk" diff-apply-hunk t]
78359
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
167 ["Test applying hunk" diff-test-hunk t]
33432
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
168 ["Apply diff with Ediff" diff-ediff-patch t]
78359
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
169 "-----"
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
170 ["Reverse direction" diff-reverse-direction t]
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
171 ["Context -> Unified" diff-context->unified t]
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
172 ["Unified -> Context" diff-unified->context t]
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
173 ;;["Fixup Headers" diff-fixup-modifs (not buffer-read-only)]
78359
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
174 "-----"
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
175 ["Split hunk" diff-split-hunk t]
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
176 ["Refine hunk" diff-refine-hunk t]
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
177 ["Kill current hunk" diff-hunk-kill t]
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
178 ["Kill current file's hunks" diff-file-kill t]
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
179 "-----"
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
180 ["Previous Hunk" diff-hunk-prev t]
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
181 ["Next Hunk" diff-hunk-next t]
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
182 ["Previous File" diff-file-prev t]
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
183 ["Next File" diff-file-next t]
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
184 ))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
185
31973
ad9838a9349c (diff-mode-map, diff-minor-mode-prefix):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31819
diff changeset
186 (defcustom diff-minor-mode-prefix "\C-c="
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
187 "Prefix key for `diff-minor-mode' commands."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61269
diff changeset
188 :type '(choice (string "\e") (string "C-c=") string)
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 61269
diff changeset
189 :group 'diff-mode)
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
190
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
191 (easy-mmode-defmap diff-minor-mode-map
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
192 `((,diff-minor-mode-prefix . ,diff-mode-shared-map))
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
193 "Keymap for `diff-minor-mode'. See also `diff-mode-shared-map'.")
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
194
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
195
33432
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
196 ;;;;
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
197 ;;;; font-lock support
33432
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
198 ;;;;
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
199
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
200 (defface diff-header
55322
a02bfe4ba7ab (diff-header-face, diff-file-header-face): Use min-colors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55088
diff changeset
201 '((((class color) (min-colors 88) (background light))
57418
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
202 :background "grey85")
55322
a02bfe4ba7ab (diff-header-face, diff-file-header-face): Use min-colors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55088
diff changeset
203 (((class color) (min-colors 88) (background dark))
57418
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
204 :background "grey45")
55322
a02bfe4ba7ab (diff-header-face, diff-file-header-face): Use min-colors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55088
diff changeset
205 (((class color) (background light))
57418
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
206 :foreground "blue1" :weight bold)
55322
a02bfe4ba7ab (diff-header-face, diff-file-header-face): Use min-colors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55088
diff changeset
207 (((class color) (background dark))
57418
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
208 :foreground "green" :weight bold)
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
209 (t :weight bold))
62553
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
210 "`diff-mode' face inherited by hunk and index header faces."
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
211 :group 'diff-mode)
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
212 ;; backward-compatibility alias
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
213 (put 'diff-header-face 'face-alias 'diff-header)
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
214 (defvar diff-header-face 'diff-header)
31734
6b057ae8165d Docstring fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31705
diff changeset
215
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
216 (defface diff-file-header
55322
a02bfe4ba7ab (diff-header-face, diff-file-header-face): Use min-colors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55088
diff changeset
217 '((((class color) (min-colors 88) (background light))
57418
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
218 :background "grey70" :weight bold)
55322
a02bfe4ba7ab (diff-header-face, diff-file-header-face): Use min-colors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55088
diff changeset
219 (((class color) (min-colors 88) (background dark))
57418
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
220 :background "grey60" :weight bold)
55322
a02bfe4ba7ab (diff-header-face, diff-file-header-face): Use min-colors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55088
diff changeset
221 (((class color) (background light))
64496
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
222 :foreground "green" :weight bold)
55322
a02bfe4ba7ab (diff-header-face, diff-file-header-face): Use min-colors.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55088
diff changeset
223 (((class color) (background dark))
57418
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
224 :foreground "cyan" :weight bold)
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
225 (t :weight bold)) ; :height 1.3
62553
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
226 "`diff-mode' face used to highlight file header lines."
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
227 :group 'diff-mode)
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
228 ;; backward-compatibility alias
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
229 (put 'diff-file-header-face 'face-alias 'diff-file-header)
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
230 (defvar diff-file-header-face 'diff-file-header)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
231
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
232 (defface diff-index
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
233 '((t :inherit diff-file-header))
62553
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
234 "`diff-mode' face used to highlight index header lines."
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
235 :group 'diff-mode)
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
236 ;; backward-compatibility alias
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
237 (put 'diff-index-face 'face-alias 'diff-index)
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
238 (defvar diff-index-face 'diff-index)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
239
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
240 (defface diff-hunk-header
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
241 '((t :inherit diff-header))
62553
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
242 "`diff-mode' face used to highlight hunk header lines."
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
243 :group 'diff-mode)
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
244 ;; backward-compatibility alias
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
245 (put 'diff-hunk-header-face 'face-alias 'diff-hunk-header)
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
246 (defvar diff-hunk-header-face 'diff-hunk-header)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
247
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
248 (defface diff-removed
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
249 '((t :inherit diff-changed))
62553
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
250 "`diff-mode' face used to highlight removed lines."
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
251 :group 'diff-mode)
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
252 ;; backward-compatibility alias
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
253 (put 'diff-removed-face 'face-alias 'diff-removed)
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
254 (defvar diff-removed-face 'diff-removed)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
255
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
256 (defface diff-added
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
257 '((t :inherit diff-changed))
62553
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
258 "`diff-mode' face used to highlight added lines."
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
259 :group 'diff-mode)
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
260 ;; backward-compatibility alias
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
261 (put 'diff-added-face 'face-alias 'diff-added)
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
262 (defvar diff-added-face 'diff-added)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
263
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
264 (defface diff-changed
32576
c6eb63e9c25c (diff-header-face, diff-file-header-face)
Eli Zaretskii <eliz@gnu.org>
parents: 32482
diff changeset
265 '((((type tty pc) (class color) (background light))
57418
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
266 :foreground "magenta" :weight bold :slant italic)
32576
c6eb63e9c25c (diff-header-face, diff-file-header-face)
Eli Zaretskii <eliz@gnu.org>
parents: 32482
diff changeset
267 (((type tty pc) (class color) (background dark))
57418
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
268 :foreground "yellow" :weight bold :slant italic))
62553
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
269 "`diff-mode' face used to highlight changed lines."
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
270 :group 'diff-mode)
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
271 ;; backward-compatibility alias
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
272 (put 'diff-changed-face 'face-alias 'diff-changed)
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
273 (defvar diff-changed-face 'diff-changed)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
274
64496
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
275 (defface diff-indicator-removed
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
276 '((t :inherit diff-removed))
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
277 "`diff-mode' face used to highlight indicator of removed lines (-, <)."
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
278 :group 'diff-mode
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
279 :version "22.1")
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
280 (defvar diff-indicator-removed-face 'diff-indicator-removed)
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
281
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
282 (defface diff-indicator-added
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
283 '((t :inherit diff-added))
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
284 "`diff-mode' face used to highlight indicator of added lines (+, >)."
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
285 :group 'diff-mode
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
286 :version "22.1")
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
287 (defvar diff-indicator-added-face 'diff-indicator-added)
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
288
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
289 (defface diff-indicator-changed
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
290 '((t :inherit diff-changed))
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
291 "`diff-mode' face used to highlight indicator of changed lines."
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
292 :group 'diff-mode
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
293 :version "22.1")
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
294 (defvar diff-indicator-changed-face 'diff-indicator-changed)
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
295
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
296 (defface diff-function
69608
0c54773776e4 (diff-function): Make it inherit from diff-header instead of diff-context.
Nick Roberts <nickrob@snap.net.nz>
parents: 68651
diff changeset
297 '((t :inherit diff-header))
62553
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
298 "`diff-mode' face used to highlight function names produced by \"diff -p\"."
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
299 :group 'diff-mode)
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
300 ;; backward-compatibility alias
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
301 (put 'diff-function-face 'face-alias 'diff-function)
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
302 (defvar diff-function-face 'diff-function)
32603
87af45b9ad99 (diff-header-face, diff-file-header-face)
Eli Zaretskii <eliz@gnu.org>
parents: 32588
diff changeset
303
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
304 (defface diff-context
64496
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
305 '((((class color grayscale) (min-colors 88)) :inherit shadow))
62553
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
306 "`diff-mode' face used to highlight context and other side-information."
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
307 :group 'diff-mode)
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
308 ;; backward-compatibility alias
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
309 (put 'diff-context-face 'face-alias 'diff-context)
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
310 (defvar diff-context-face 'diff-context)
31734
6b057ae8165d Docstring fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31705
diff changeset
311
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
312 (defface diff-nonexistent
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
313 '((t :inherit diff-file-header))
62553
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
314 "`diff-mode' face used to highlight nonexistent files in recursive diffs."
e7408ff25265 (diff-header-face, diff-file-header-face)
Lute Kamstra <lute@gnu.org>
parents: 62531
diff changeset
315 :group 'diff-mode)
63197
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
316 ;; backward-compatibility alias
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
317 (put 'diff-nonexistent-face 'face-alias 'diff-nonexistent)
ce2a9eb0ff8a Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Miles Bader <miles@gnu.org>
parents: 63051
diff changeset
318 (defvar diff-nonexistent-face 'diff-nonexistent)
37531
e71362bfa695 (diff-nonexistant-face): New face.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35526
diff changeset
319
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
320 (defconst diff-yank-handler '(diff-yank-function))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
321 (defun diff-yank-function (text)
54540
2449619c7ccf (diff-font-lock-keywords): Disable yank-handler.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54528
diff changeset
322 ;; FIXME: the yank-handler is now called separately on each piece of text
2449619c7ccf (diff-font-lock-keywords): Disable yank-handler.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54528
diff changeset
323 ;; with a yank-handler property, so the next-single-property-change call
2449619c7ccf (diff-font-lock-keywords): Disable yank-handler.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54528
diff changeset
324 ;; below will always return nil :-( --stef
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
325 (let ((mixed (next-single-property-change 0 'yank-handler text))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
326 (start (point)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
327 ;; First insert the text.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
328 (insert text)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
329 ;; If the text does not include any diff markers and if we're not
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
330 ;; yanking back into a diff-mode buffer, get rid of the prefixes.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
331 (unless (or mixed (derived-mode-p 'diff-mode))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
332 (undo-boundary) ; Just in case the user wanted the prefixes.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
333 (let ((re (save-excursion
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
334 (if (re-search-backward "^[><!][ \t]" start t)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
335 (if (eq (char-after) ?!)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
336 "^[!+- ][ \t]" "^[<>][ \t]")
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
337 "^[ <>!+-]"))))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
338 (save-excursion
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
339 (while (re-search-backward re start t)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
340 (replace-match "" t t)))))))
61269
5d2796fc9f80 (diff-minor-mode): Specify :group.
Lute Kamstra <lute@gnu.org>
parents: 57418
diff changeset
341
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
342
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
343 (defvar diff-font-lock-keywords
64496
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
344 `(("^\\(@@ -[0-9,]+ \\+[0-9,]+ @@\\)\\(.*\\)$" ;unified
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
345 (1 diff-hunk-header-face) (2 diff-function-face))
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
346 ("^\\(\\*\\{15\\}\\)\\(.*\\)$" ;context
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
347 (1 diff-hunk-header-face) (2 diff-function-face))
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
348 ("^\\*\\*\\* .+ \\*\\*\\*\\*". diff-hunk-header-face) ;context
64496
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
349 ("^--- .+ ----$" . diff-hunk-header-face) ;context
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
350 ("^[0-9,]+[acd][0-9,]+$" . diff-hunk-header-face) ;normal
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
351 ("^---$" . diff-hunk-header-face) ;normal
32111
161c2ec9f5b2 (diff-font-lock-keywords): Minor regex fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32063
diff changeset
352 ("^\\(---\\|\\+\\+\\+\\|\\*\\*\\*\\) \\(\\S-+\\)\\(.*[^*-]\\)?\n"
31734
6b057ae8165d Docstring fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31705
diff changeset
353 (0 diff-header-face) (2 diff-file-header-face prepend))
64496
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
354 ("^\\([-<]\\)\\(.*\n\\)"
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
355 (1 diff-indicator-removed-face) (2 diff-removed-face))
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
356 ("^\\([+>]\\)\\(.*\n\\)"
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
357 (1 diff-indicator-added-face) (2 diff-added-face))
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
358 ("^\\(!\\)\\(.*\n\\)"
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
359 (1 diff-indicator-changed-face) (2 diff-changed-face))
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
360 ("^Index: \\(.+\\).*\n"
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
361 (0 diff-header-face) (1 diff-index-face prepend))
37567
50d77d1b2d58 (diff-nonexistent-face, diff-font-lock-keywords):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37531
diff changeset
362 ("^Only in .*\n" . diff-nonexistent-face)
64496
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
363 ("^\\(#\\)\\(.*\\)"
64512
a4d1eb8d55e6 (diff-font-lock-keywords): Simplify comments fontifying rule.
Juri Linkov <juri@jurta.org>
parents: 64496
diff changeset
364 (1 font-lock-comment-delimiter-face)
a4d1eb8d55e6 (diff-font-lock-keywords): Simplify comments fontifying rule.
Juri Linkov <juri@jurta.org>
parents: 64496
diff changeset
365 (2 font-lock-comment-face))
64496
558b187cced1 (diff-file-header): Change foreground color from
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
366 ("^[^-=+*!<>#].*\n" (0 diff-context-face))))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
367
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
368 (defconst diff-font-lock-defaults
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
369 '(diff-font-lock-keywords t nil nil nil (font-lock-multiline . nil)))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
370
31269
64bb4634d6d8 (diff-mode) <defgroup>: Add :version.
Dave Love <fx@gnu.org>
parents: 30873
diff changeset
371 (defvar diff-imenu-generic-expression
64bb4634d6d8 (diff-mode) <defgroup>: Add :version.
Dave Love <fx@gnu.org>
parents: 30873
diff changeset
372 ;; Prefer second name as first is most likely to be a backup or
33488
352cb95d9f27 (diff-imenu-generic-expression): Modify unidiff
Dave Love <fx@gnu.org>
parents: 33432
diff changeset
373 ;; version-control name. The [\t\n] at the end of the unidiff pattern
352cb95d9f27 (diff-imenu-generic-expression): Modify unidiff
Dave Love <fx@gnu.org>
parents: 33432
diff changeset
374 ;; catches Debian source diff files (which lack the trailing date).
352cb95d9f27 (diff-imenu-generic-expression): Modify unidiff
Dave Love <fx@gnu.org>
parents: 33432
diff changeset
375 '((nil "\\+\\+\\+\\ \\([^\t\n]+\\)[\t\n]" 1) ; unidiffs
31269
64bb4634d6d8 (diff-mode) <defgroup>: Add :version.
Dave Love <fx@gnu.org>
parents: 30873
diff changeset
376 (nil "^--- \\([^\t\n]+\\)\t.*\n\\*" 1))) ; context diffs
64bb4634d6d8 (diff-mode) <defgroup>: Add :version.
Dave Love <fx@gnu.org>
parents: 30873
diff changeset
377
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
378 ;;;;
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
379 ;;;; Movement
33432
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
380 ;;;;
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
381
29423
12e89e9b65f6 (diff-font-lock-keywords, diff-hunk-header-re)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28858
diff changeset
382 (defconst diff-hunk-header-re "^\\(@@ -[0-9,]+ \\+[0-9,]+ @@.*\\|\\*\\{15\\}.*\n\\*\\*\\* .+ \\*\\*\\*\\*\\|[0-9]+\\(,[0-9]+\\)?[acd][0-9]+\\(,[0-9]+\\)?\\)$")
57279
c8797551b3a0 (diff-file-header-re): Tighten up regexp a tiny bit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57020
diff changeset
383 (defconst diff-file-header-re (concat "^\\(--- .+\n\\+\\+\\+ \\|\\*\\*\\* .+\n--- \\|[^-+!<>0-9@* ]\\).+\n" (substring diff-hunk-header-re 1)))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
384 (defvar diff-narrowed-to nil)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
385
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
386 (defun diff-end-of-hunk (&optional style)
54928
28a55e2ec30f (diff-end-of-hunk): Be more careful with unified hunks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54869
diff changeset
387 (when (looking-at diff-hunk-header-re)
28a55e2ec30f (diff-end-of-hunk): Be more careful with unified hunks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54869
diff changeset
388 (unless style
28a55e2ec30f (diff-end-of-hunk): Be more careful with unified hunks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54869
diff changeset
389 ;; Especially important for unified (because headers are ambiguous).
28a55e2ec30f (diff-end-of-hunk): Be more careful with unified hunks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54869
diff changeset
390 (setq style (cdr (assq (char-after) '((?@ . unified) (?* . context))))))
28a55e2ec30f (diff-end-of-hunk): Be more careful with unified hunks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54869
diff changeset
391 (goto-char (match-end 0)))
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
392 (let ((end (and (re-search-forward (case style
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
393 ;; A `unified' header is ambiguous.
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
394 (unified (concat "^[^-+# \\]\\|"
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
395 diff-file-header-re))
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
396 (context "^[^-+#! \\]")
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
397 (normal "^[^<>#\\]")
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
398 (t "^[^-+#!<> \\]"))
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
399 nil t)
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
400 (match-beginning 0))))
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
401 ;; The return value is used by easy-mmode-define-navigation.
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
402 (goto-char (or end (point-max)))))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
403
78359
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
404 (defun diff-beginning-of-hunk (&optional try-harder)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
405 "Move back to beginning of hunk.
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
406 If TRY-HARDER is non-nil, try to cater to the case where we're not in a hunk
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
407 but in the file header instead, in which case move forward to the first hunk."
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
408 (beginning-of-line)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
409 (unless (looking-at diff-hunk-header-re)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
410 (forward-line 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
411 (condition-case ()
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
412 (re-search-backward diff-hunk-header-re)
78359
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
413 (error
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
414 (if (not try-harder)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
415 (error "Can't find the beginning of the hunk")
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
416 (diff-beginning-of-file-and-junk)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
417 (diff-hunk-next))))))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
418
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
419 (defun diff-beginning-of-file ()
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
420 (beginning-of-line)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
421 (unless (looking-at diff-file-header-re)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
422 (forward-line 2)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
423 (condition-case ()
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
424 (re-search-backward diff-file-header-re)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
425 (error (error "Can't find the beginning of the file")))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
426
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
427 (defun diff-end-of-file ()
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
428 (re-search-forward "^[-+#!<>0-9@* \\]" nil t)
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
429 (re-search-forward (concat "^[^-+#!<>0-9@* \\]\\|" diff-file-header-re)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
430 nil 'move)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
431 (if (match-beginning 1)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
432 (goto-char (match-beginning 1))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
433 (beginning-of-line)))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
434
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
435 ;; Define diff-{hunk,file}-{prev,next}
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
436 (easy-mmode-define-navigation
53058
6ae6b1d05de0 (diff-hunk-prev, diff-hunk-next): Support
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 52401
diff changeset
437 diff-hunk diff-hunk-header-re "hunk" diff-end-of-hunk diff-restrict-view)
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
438 (easy-mmode-define-navigation
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
439 diff-file diff-file-header-re "file" diff-end-of-hunk)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
440
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
441 (defun diff-restrict-view (&optional arg)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
442 "Restrict the view to the current hunk.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
443 If the prefix ARG is given, restrict the view to the current file instead."
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
444 (interactive "P")
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
445 (save-excursion
78359
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
446 (if arg (diff-beginning-of-file) (diff-beginning-of-hunk 'try-harder))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
447 (narrow-to-region (point)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
448 (progn (if arg (diff-end-of-file) (diff-end-of-hunk))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
449 (point)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
450 (set (make-local-variable 'diff-narrowed-to) (if arg 'file 'hunk))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
451
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
452
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
453 (defun diff-hunk-kill ()
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
454 "Kill current hunk."
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
455 (interactive)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
456 (diff-beginning-of-hunk)
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
457 (let* ((start (point))
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
458 (nexthunk (when (re-search-forward diff-hunk-header-re nil t)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
459 (match-beginning 0)))
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
460 (firsthunk (ignore-errors
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
461 (goto-char start)
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
462 (diff-beginning-of-file) (diff-hunk-next) (point)))
71249
3798a822991e * diff-mode.el (diff-hunk-kill, diff-file-kill, diff-split-hunk)
Chong Yidong <cyd@stupidchicken.com>
parents: 71248
diff changeset
463 (nextfile (ignore-errors (diff-file-next) (point)))
3798a822991e * diff-mode.el (diff-hunk-kill, diff-file-kill, diff-split-hunk)
Chong Yidong <cyd@stupidchicken.com>
parents: 71248
diff changeset
464 (inhibit-read-only t))
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
465 (goto-char start)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
466 (if (and firsthunk (= firsthunk start)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
467 (or (null nexthunk)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
468 (and nextfile (> nexthunk nextfile))))
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
469 ;; It's the only hunk for this file, so kill the file.
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
470 (diff-file-kill)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
471 (diff-end-of-hunk)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
472 (kill-region start (point)))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
473
78359
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
474 (defun diff-beginning-of-file-and-junk ()
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
475 "Go to the beginning of file-related diff-info.
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
476 This is like `diff-beginning-of-file' except it tries to skip back over leading
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
477 data such as \"Index: ...\" and such."
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
478 (let ((start (point))
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
479 (file (condition-case err (progn (diff-beginning-of-file) (point))
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
480 (error err)))
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
481 ;; prevhunk is one of the limits.
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
482 (prevhunk (save-excursion (ignore-errors (diff-hunk-prev) (point))))
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
483 err)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
484 (when (consp file)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
485 ;; Presumably, we started before the file header, in the leading junk.
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
486 (setq err file)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
487 (diff-file-next)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
488 (setq file (point)))
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
489 (let ((index (save-excursion
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
490 (re-search-backward "^Index: " prevhunk t))))
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
491 (when index (setq file index))
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
492 (if (<= file start)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
493 (goto-char file)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
494 ;; File starts *after* the starting point: we really weren't in
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
495 ;; a file diff but elsewhere.
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
496 (goto-char start)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
497 (signal (car err) (cdr err))))))
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
498
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
499 (defun diff-file-kill ()
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
500 "Kill current file's hunks."
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
501 (interactive)
78359
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
502 (diff-beginning-of-file-and-junk)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
503 (let* ((start (point))
71249
3798a822991e * diff-mode.el (diff-hunk-kill, diff-file-kill, diff-split-hunk)
Chong Yidong <cyd@stupidchicken.com>
parents: 71248
diff changeset
504 (inhibit-read-only t))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
505 (diff-end-of-file)
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
506 (if (looking-at "^\n") (forward-char 1)) ;`tla' generates such diffs.
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
507 (kill-region start (point))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
508
27637
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
509 (defun diff-kill-junk ()
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
510 "Kill spurious empty diffs."
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
511 (interactive)
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
512 (save-excursion
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
513 (let ((inhibit-read-only t))
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
514 (goto-char (point-min))
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
515 (while (re-search-forward (concat "^\\(Index: .*\n\\)"
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
516 "\\([^-+!* <>].*\n\\)*?"
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
517 "\\(\\(Index:\\) \\|"
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
518 diff-file-header-re "\\)")
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
519 nil t)
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
520 (delete-region (if (match-end 4) (match-beginning 0) (match-end 1))
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
521 (match-beginning 3))
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
522 (beginning-of-line)))))
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
523
33432
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
524 (defun diff-count-matches (re start end)
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
525 (save-excursion
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
526 (let ((n 0))
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
527 (goto-char start)
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
528 (while (re-search-forward re end t) (incf n))
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
529 n)))
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
530
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
531 (defun diff-split-hunk ()
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
532 "Split the current (unified diff) hunk at point into two hunks."
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
533 (interactive)
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
534 (beginning-of-line)
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
535 (let ((pos (point))
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
536 (start (progn (diff-beginning-of-hunk) (point))))
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
537 (unless (looking-at "@@ -\\([0-9]+\\),[0-9]+ \\+\\([0-9]+\\),[0-9]+ @@")
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
538 (error "diff-split-hunk only works on unified context diffs"))
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
539 (forward-line 1)
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
540 (let* ((start1 (string-to-number (match-string 1)))
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
541 (start2 (string-to-number (match-string 2)))
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
542 (newstart1 (+ start1 (diff-count-matches "^[- \t]" (point) pos)))
71249
3798a822991e * diff-mode.el (diff-hunk-kill, diff-file-kill, diff-split-hunk)
Chong Yidong <cyd@stupidchicken.com>
parents: 71248
diff changeset
543 (newstart2 (+ start2 (diff-count-matches "^[+ \t]" (point) pos)))
3798a822991e * diff-mode.el (diff-hunk-kill, diff-file-kill, diff-split-hunk)
Chong Yidong <cyd@stupidchicken.com>
parents: 71248
diff changeset
544 (inhibit-read-only t))
33432
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
545 (goto-char pos)
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
546 ;; Hopefully the after-change-function will not screw us over.
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
547 (insert "@@ -" (number-to-string newstart1) ",1 +"
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
548 (number-to-string newstart2) ",1 @@\n")
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
549 ;; Fix the original hunk-header.
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
550 (diff-fixup-modifs start pos))))
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47523
diff changeset
551
33432
7f6ffdaecedc (diff-mode-menu): Add entry for applying hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32666
diff changeset
552
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
553 ;;;;
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
554 ;;;; jump to other buffers
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
555 ;;;;
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
556
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
557 (defvar diff-remembered-files-alist nil)
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
558
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
559 (defun diff-filename-drop-dir (file)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
560 (when (string-match "/" file) (substring file (match-end 0))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
561
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
562 (defun diff-merge-strings (ancestor from to)
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
563 "Merge the diff between ANCESTOR and FROM into TO.
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
564 Returns the merged string if successful or nil otherwise.
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
565 The strings are assumed not to contain any \"\\n\" (i.e. end of line).
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
566 If ANCESTOR = FROM, returns TO.
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
567 If ANCESTOR = TO, returns FROM.
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
568 The heuristic is simplistic and only really works for cases
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
569 like \(diff-merge-strings \"b/foo\" \"b/bar\" \"/a/c/foo\")."
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
570 ;; Ideally, we want:
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
571 ;; AMB ANB CMD -> CND
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
572 ;; but that's ambiguous if `foo' or `bar' is empty:
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
573 ;; a/foo a/foo1 b/foo.c -> b/foo1.c but not 1b/foo.c or b/foo.c1
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
574 (let ((str (concat ancestor "\n" from "\n" to)))
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
575 (when (and (string-match (concat
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
576 "\\`\\(.*?\\)\\(.*\\)\\(.*\\)\n"
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
577 "\\1\\(.*\\)\\3\n"
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
578 "\\(.*\\(\\2\\).*\\)\\'") str)
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
579 (equal to (match-string 5 str)))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
580 (concat (substring str (match-beginning 5) (match-beginning 6))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
581 (match-string 4 str)
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
582 (substring str (match-end 6) (match-end 5))))))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
583
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
584 (defun diff-tell-file-name (old name)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
585 "Tell Emacs where the find the source file of the current hunk.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
586 If the OLD prefix arg is passed, tell the file NAME of the old file."
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
587 (interactive
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
588 (let* ((old current-prefix-arg)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
589 (fs (diff-hunk-file-names current-prefix-arg)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
590 (unless fs (error "No file name to look for"))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
591 (list old (read-file-name (format "File for %s: " (car fs))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
592 nil (diff-find-file-name old) t))))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
593 (let ((fs (diff-hunk-file-names old)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
594 (unless fs (error "No file name to look for"))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
595 (push (cons fs name) diff-remembered-files-alist)))
61269
5d2796fc9f80 (diff-minor-mode): Specify :group.
Lute Kamstra <lute@gnu.org>
parents: 57418
diff changeset
596
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
597 (defun diff-hunk-file-names (&optional old)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
598 "Give the list of file names textually mentioned for the current hunk."
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
599 (save-excursion
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
600 (unless (looking-at diff-file-header-re)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
601 (or (ignore-errors (diff-beginning-of-file))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
602 (re-search-forward diff-file-header-re nil t)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
603 (let ((limit (save-excursion
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
604 (condition-case ()
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
605 (progn (diff-hunk-prev) (point))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
606 (error (point-min)))))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
607 (header-files
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
608 (if (looking-at "[-*][-*][-*] \\(\\S-+\\)\\(\\s-.*\\)?\n[-+][-+][-+] \\(\\S-+\\)")
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
609 (list (if old (match-string 1) (match-string 3))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
610 (if old (match-string 3) (match-string 1)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
611 (forward-line 1) nil)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
612 (delq nil
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
613 (append
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
614 (when (and (not old)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
615 (save-excursion
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
616 (re-search-backward "^Index: \\(.+\\)" limit t)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
617 (list (match-string 1)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
618 header-files
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
619 (when (re-search-backward
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
620 "^diff \\(-\\S-+ +\\)*\\(\\S-+\\)\\( +\\(\\S-+\\)\\)?"
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
621 nil t)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
622 (list (if old (match-string 2) (match-string 4))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
623 (if old (match-string 4) (match-string 2)))))))))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
624
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
625 (defun diff-find-file-name (&optional old prefix)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
626 "Return the file corresponding to the current patch.
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
627 Non-nil OLD means that we want the old file.
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
628 PREFIX is only used internally: don't use it."
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
629 (save-excursion
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
630 (unless (looking-at diff-file-header-re)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
631 (or (ignore-errors (diff-beginning-of-file))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
632 (re-search-forward diff-file-header-re nil t)))
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
633 (let ((fs (diff-hunk-file-names old)))
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
634 (if prefix (setq fs (mapcar (lambda (f) (concat prefix f)) fs)))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
635 (or
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
636 ;; use any previously used preference
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
637 (cdr (assoc fs diff-remembered-files-alist))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
638 ;; try to be clever and use previous choices as an inspiration
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
639 (dolist (rf diff-remembered-files-alist)
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
640 (let ((newfile (diff-merge-strings (caar rf) (car fs) (cdr rf))))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
641 (if (and newfile (file-exists-p newfile)) (return newfile))))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
642 ;; look for each file in turn. If none found, try again but
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
643 ;; ignoring the first level of directory, ...
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
644 (do* ((files fs (delq nil (mapcar 'diff-filename-drop-dir files)))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
645 (file nil nil))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
646 ((or (null files)
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
647 (setq file (do* ((files files (cdr files))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
648 (file (car files) (car files)))
78676
b2023ab19990 (diff-find-file-name): Only accept regular files, to rule out
Glenn Morris <rgm@gnu.org>
parents: 78429
diff changeset
649 ;; Use file-regular-p to avoid
b2023ab19990 (diff-find-file-name): Only accept regular files, to rule out
Glenn Morris <rgm@gnu.org>
parents: 78429
diff changeset
650 ;; /dev/null, directories, etc.
b2023ab19990 (diff-find-file-name): Only accept regular files, to rule out
Glenn Morris <rgm@gnu.org>
parents: 78429
diff changeset
651 ((or (null file) (file-regular-p file))
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
652 file))))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
653 file))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
654 ;; <foo>.rej patches implicitly apply to <foo>
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
655 (and (string-match "\\.rej\\'" (or buffer-file-name ""))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
656 (let ((file (substring buffer-file-name 0 (match-beginning 0))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
657 (when (file-exists-p file) file)))
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
658 ;; If we haven't found the file, maybe it's because we haven't paid
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
659 ;; attention to the PCL-CVS hint.
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
660 (and (not prefix)
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
661 (boundp 'cvs-pcl-cvs-dirchange-re)
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
662 (save-excursion
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
663 (re-search-backward cvs-pcl-cvs-dirchange-re nil t))
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
664 (diff-find-file-name old (match-string 1)))
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
665 ;; if all else fails, ask the user
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
666 (let ((file (read-file-name (format "Use file %s: " (or (first fs) ""))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
667 nil (first fs) t (first fs))))
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
668 (set (make-local-variable 'diff-remembered-files-alist)
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
669 (cons (cons fs file) diff-remembered-files-alist))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
670 file)))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
671
32012
b1edfcd919a7 (diff-add-log-file-name): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31973
diff changeset
672
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
673 (defun diff-ediff-patch ()
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
674 "Call `ediff-patch-file' on the current buffer."
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
675 (interactive)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
676 (condition-case err
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
677 (ediff-patch-file nil (current-buffer))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
678 (wrong-number-of-arguments (ediff-patch-file))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
679
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47523
diff changeset
680 ;;;;
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
681 ;;;; Conversion functions
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47523
diff changeset
682 ;;;;
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
683
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
684 ;;(defvar diff-inhibit-after-change nil
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
685 ;; "Non-nil means inhibit `diff-mode's after-change functions.")
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
686
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
687 (defun diff-unified->context (start end)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
688 "Convert unified diffs to context diffs.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
689 START and END are either taken from the region (if a prefix arg is given) or
78429
a3a4480349cb (diff-unified->context, diff-reverse-direction, diff-fixup-modifs):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78359
diff changeset
690 else cover the whole buffer."
70542
ef7506f44a3a (diff-context->unified): Use `region-beginning' and `region-end'
Juri Linkov <juri@jurta.org>
parents: 70333
diff changeset
691 (interactive (if (or current-prefix-arg (and transient-mark-mode mark-active))
ef7506f44a3a (diff-context->unified): Use `region-beginning' and `region-end'
Juri Linkov <juri@jurta.org>
parents: 70333
diff changeset
692 (list (region-beginning) (region-end))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
693 (list (point-min) (point-max))))
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
694 (unless (markerp end) (setq end (copy-marker end t)))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
695 (let (;;(diff-inhibit-after-change t)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
696 (inhibit-read-only t))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
697 (save-excursion
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
698 (goto-char start)
29423
12e89e9b65f6 (diff-font-lock-keywords, diff-hunk-header-re)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28858
diff changeset
699 (while (and (re-search-forward "^\\(\\(---\\) .+\n\\(\\+\\+\\+\\) .+\\|@@ -\\([0-9]+\\),\\([0-9]+\\) \\+\\([0-9]+\\),\\([0-9]+\\) @@.*\\)$" nil t)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
700 (< (point) end))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
701 (combine-after-change-calls
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
702 (if (match-beginning 2)
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
703 ;; we matched a file header
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
704 (progn
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
705 ;; use reverse order to make sure the indices are kept valid
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
706 (replace-match "---" t t nil 3)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
707 (replace-match "***" t t nil 2))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
708 ;; we matched a hunk header
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
709 (let ((line1 (match-string 4))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
710 (lines1 (match-string 5))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
711 (line2 (match-string 6))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
712 (lines2 (match-string 7)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
713 (replace-match
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
714 (concat "***************\n*** " line1 ","
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
715 (number-to-string (+ (string-to-number line1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
716 (string-to-number lines1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
717 -1)) " ****"))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
718 (forward-line 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
719 (save-restriction
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
720 (narrow-to-region (point)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
721 (progn (diff-end-of-hunk 'unified) (point)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
722 (let ((hunk (buffer-string)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
723 (goto-char (point-min))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
724 (if (not (save-excursion (re-search-forward "^-" nil t)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
725 (delete-region (point) (point-max))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
726 (goto-char (point-max))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
727 (let ((modif nil) last-pt)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
728 (while (progn (setq last-pt (point))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
729 (= (forward-line -1) 0))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
730 (case (char-after)
64045
30fe6a97264a Fix brainos.
Juanma Barranquero <lekktu@gmail.com>
parents: 64004
diff changeset
731 (?\s (insert " ") (setq modif nil) (backward-char 1))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
732 (?+ (delete-region (point) last-pt) (setq modif t))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
733 (?- (if (not modif)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
734 (progn (forward-char 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
735 (insert " "))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
736 (delete-char 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
737 (insert "! "))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
738 (backward-char 2))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
739 (?\\ (when (save-excursion (forward-line -1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
740 (= (char-after) ?+))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
741 (delete-region (point) last-pt) (setq modif t)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
742 (t (setq modif nil))))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
743 (goto-char (point-max))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
744 (save-excursion
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
745 (insert "--- " line2 ","
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
746 (number-to-string (+ (string-to-number line2)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
747 (string-to-number lines2)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
748 -1)) " ----\n" hunk))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
749 ;;(goto-char (point-min))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
750 (forward-line 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
751 (if (not (save-excursion (re-search-forward "^+" nil t)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
752 (delete-region (point) (point-max))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
753 (let ((modif nil) (delete nil))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
754 (while (not (eobp))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
755 (case (char-after)
64045
30fe6a97264a Fix brainos.
Juanma Barranquero <lekktu@gmail.com>
parents: 64004
diff changeset
756 (?\s (insert " ") (setq modif nil) (backward-char 1))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
757 (?- (setq delete t) (setq modif t))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
758 (?+ (if (not modif)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
759 (progn (forward-char 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
760 (insert " "))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
761 (delete-char 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
762 (insert "! "))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
763 (backward-char 2))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
764 (?\\ (when (save-excursion (forward-line 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
765 (not (eobp)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
766 (setq delete t) (setq modif t)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
767 (t (setq modif nil)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
768 (let ((last-pt (point)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
769 (forward-line 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
770 (when delete
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
771 (delete-region last-pt (point))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
772 (setq delete nil)))))))))))))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
773
70333
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
774 (defun diff-context->unified (start end &optional to-context)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
775 "Convert context diffs to unified diffs.
70333
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
776 START and END are either taken from the region
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
777 \(when it is highlighted) or else cover the whole buffer.
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
778 With a prefix argument, convert unified format to context format."
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
779 (interactive (if (and transient-mark-mode mark-active)
70542
ef7506f44a3a (diff-context->unified): Use `region-beginning' and `region-end'
Juri Linkov <juri@jurta.org>
parents: 70333
diff changeset
780 (list (region-beginning) (region-end) current-prefix-arg)
70333
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
781 (list (point-min) (point-max) current-prefix-arg)))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
782 (if to-context
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
783 (diff-unified->context start end)
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
784 (unless (markerp end) (setq end (copy-marker end t)))
70333
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
785 (let ( ;;(diff-inhibit-after-change t)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
786 (inhibit-read-only t))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
787 (save-excursion
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
788 (goto-char start)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
789 (while (and (re-search-forward "^\\(\\(\\*\\*\\*\\) .+\n\\(---\\) .+\\|\\*\\{15\\}.*\n\\*\\*\\* \\([0-9]+\\),\\(-?[0-9]+\\) \\*\\*\\*\\*\\)$" nil t)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
790 (< (point) end))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
791 (combine-after-change-calls
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
792 (if (match-beginning 2)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
793 ;; we matched a file header
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
794 (progn
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
795 ;; use reverse order to make sure the indices are kept valid
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
796 (replace-match "+++" t t nil 3)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
797 (replace-match "---" t t nil 2))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
798 ;; we matched a hunk header
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
799 (let ((line1s (match-string 4))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
800 (line1e (match-string 5))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
801 (pt1 (match-beginning 0)))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
802 (replace-match "")
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
803 (unless (re-search-forward
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
804 "^--- \\([0-9]+\\),\\(-?[0-9]+\\) ----$" nil t)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
805 (error "Can't find matching `--- n1,n2 ----' line"))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
806 (let ((line2s (match-string 1))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
807 (line2e (match-string 2))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
808 (pt2 (progn
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
809 (delete-region (progn (beginning-of-line) (point))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
810 (progn (forward-line 1) (point)))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
811 (point-marker))))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
812 (goto-char pt1)
70333
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
813 (forward-line 1)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
814 (while (< (point) pt2)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
815 (case (char-after)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
816 ((?! ?-) (delete-char 2) (insert "-") (forward-line 1))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
817 (?\s ;merge with the other half of the chunk
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
818 (let* ((endline2
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
819 (save-excursion
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
820 (goto-char pt2) (forward-line 1) (point)))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
821 (c (char-after pt2)))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
822 (case c
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
823 ((?! ?+)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
824 (insert "+"
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
825 (prog1 (buffer-substring (+ pt2 2) endline2)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
826 (delete-region pt2 endline2))))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
827 (?\s ;FIXME: check consistency
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
828 (delete-region pt2 endline2)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
829 (delete-char 1)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
830 (forward-line 1))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
831 (?\\ (forward-line 1))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
832 (t (delete-char 1) (forward-line 1)))))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
833 (t (forward-line 1))))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
834 (while (looking-at "[+! ] ")
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
835 (if (/= (char-after) ?!) (forward-char 1)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
836 (delete-char 1) (insert "+"))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
837 (delete-char 1) (forward-line 1))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
838 (save-excursion
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
839 (goto-char pt1)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
840 (insert "@@ -" line1s ","
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
841 (number-to-string (- (string-to-number line1e)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
842 (string-to-number line1s)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
843 -1))
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
844 " +" line2s ","
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
845 (number-to-string (- (string-to-number line2e)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
846 (string-to-number line2s)
64d227e5dd44 (diff-mode-shared-map): Don't bind M-W, M-U, M-C,
Richard M. Stallman <rms@gnu.org>
parents: 70292
diff changeset
847 -1)) " @@")))))))))))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
848
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
849 (defun diff-reverse-direction (start end)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
850 "Reverse the direction of the diffs.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
851 START and END are either taken from the region (if a prefix arg is given) or
78429
a3a4480349cb (diff-unified->context, diff-reverse-direction, diff-fixup-modifs):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78359
diff changeset
852 else cover the whole buffer."
70542
ef7506f44a3a (diff-context->unified): Use `region-beginning' and `region-end'
Juri Linkov <juri@jurta.org>
parents: 70333
diff changeset
853 (interactive (if (or current-prefix-arg (and transient-mark-mode mark-active))
ef7506f44a3a (diff-context->unified): Use `region-beginning' and `region-end'
Juri Linkov <juri@jurta.org>
parents: 70333
diff changeset
854 (list (region-beginning) (region-end))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
855 (list (point-min) (point-max))))
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
856 (unless (markerp end) (setq end (copy-marker end t)))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
857 (let (;;(diff-inhibit-after-change t)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
858 (inhibit-read-only t))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
859 (save-excursion
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
860 (goto-char start)
29423
12e89e9b65f6 (diff-font-lock-keywords, diff-hunk-header-re)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28858
diff changeset
861 (while (and (re-search-forward "^\\(\\([-*][-*][-*] \\)\\(.+\\)\n\\([-+][-+][-+] \\)\\(.+\\)\\|\\*\\{15\\}.*\n\\*\\*\\* \\(.+\\) \\*\\*\\*\\*\\|@@ -\\([0-9,]+\\) \\+\\([0-9,]+\\) @@.*\\)$" nil t)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
862 (< (point) end))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
863 (combine-after-change-calls
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
864 (cond
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
865 ;; a file header
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
866 ((match-beginning 2) (replace-match "\\2\\5\n\\4\\3" nil))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
867 ;; a context-diff hunk header
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
868 ((match-beginning 6)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
869 (let ((pt-lines1 (match-beginning 6))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
870 (lines1 (match-string 6)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
871 (replace-match "" nil nil nil 6)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
872 (forward-line 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
873 (let ((half1s (point)))
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
874 (while (looking-at "[-! \\][ \t]\\|#")
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
875 (when (= (char-after) ?-) (delete-char 1) (insert "+"))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
876 (forward-line 1))
27637
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
877 (let ((half1 (delete-and-extract-region half1s (point))))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
878 (unless (looking-at "^--- \\([0-9]+,-?[0-9]+\\) ----$")
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
879 (insert half1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
880 (error "Can't find matching `--- n1,n2 ----' line"))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
881 (let ((str1 (match-string 1)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
882 (replace-match lines1 nil nil nil 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
883 (forward-line 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
884 (let ((half2s (point)))
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
885 (while (looking-at "[!+ \\][ \t]\\|#")
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
886 (when (= (char-after) ?+) (delete-char 1) (insert "-"))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
887 (forward-line 1))
27637
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
888 (let ((half2 (delete-and-extract-region half2s (point))))
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
889 (insert (or half1 ""))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
890 (goto-char half1s)
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
891 (insert (or half2 ""))))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
892 (goto-char pt-lines1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
893 (insert str1))))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
894 ;; a unified-diff hunk header
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
895 ((match-beginning 7)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
896 (replace-match "@@ -\\8 +\\7 @@" nil)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
897 (forward-line 1)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
898 (let ((c (char-after)) first last)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
899 (while (case (setq c (char-after))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
900 (?- (setq first (or first (point)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
901 (delete-char 1) (insert "+") t)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
902 (?+ (setq last (or last (point)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
903 (delete-char 1) (insert "-") t)
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
904 ((?\\ ?#) t)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
905 (t (when (and first last (< first last))
46407
4c4398249108 (diff-reverse-direction): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42472
diff changeset
906 (insert (delete-and-extract-region first last)))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
907 (setq first nil last nil)
64004
ea880752de3b (diff-mode): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 63415
diff changeset
908 (equal ?\s c)))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
909 (forward-line 1))))))))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
910
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
911 (defun diff-fixup-modifs (start end)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
912 "Fixup the hunk headers (in case the buffer was modified).
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
913 START and END are either taken from the region (if a prefix arg is given) or
78429
a3a4480349cb (diff-unified->context, diff-reverse-direction, diff-fixup-modifs):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 78359
diff changeset
914 else cover the whole buffer."
70542
ef7506f44a3a (diff-context->unified): Use `region-beginning' and `region-end'
Juri Linkov <juri@jurta.org>
parents: 70333
diff changeset
915 (interactive (if (or current-prefix-arg (and transient-mark-mode mark-active))
ef7506f44a3a (diff-context->unified): Use `region-beginning' and `region-end'
Juri Linkov <juri@jurta.org>
parents: 70333
diff changeset
916 (list (region-beginning) (region-end))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
917 (list (point-min) (point-max))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
918 (let ((inhibit-read-only t))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
919 (save-excursion
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
920 (goto-char end) (diff-end-of-hunk)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
921 (let ((plus 0) (minus 0) (space 0) (bang 0))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
922 (while (and (= (forward-line -1) 0) (<= start (point)))
57279
c8797551b3a0 (diff-file-header-re): Tighten up regexp a tiny bit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57020
diff changeset
923 (if (not (looking-at
c8797551b3a0 (diff-file-header-re): Tighten up regexp a tiny bit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57020
diff changeset
924 (concat "@@ -[0-9,]+ \\+[0-9,]+ @@"
c8797551b3a0 (diff-file-header-re): Tighten up regexp a tiny bit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57020
diff changeset
925 "\\|[-*][-*][-*] [0-9,]+ [-*][-*][-*][-*]$"
c8797551b3a0 (diff-file-header-re): Tighten up regexp a tiny bit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57020
diff changeset
926 "\\|--- .+\n\\+\\+\\+ ")))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
927 (case (char-after)
57279
c8797551b3a0 (diff-file-header-re): Tighten up regexp a tiny bit.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57020
diff changeset
928 (?\s (incf space))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
929 (?+ (incf plus))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
930 (?- (incf minus))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
931 (?! (incf bang))
28858
85d4cc0b8741 (diff-font-lock-keywords): Recognize comments.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28240
diff changeset
932 ((?\\ ?#) nil)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
933 (t (setq space 0 plus 0 minus 0 bang 0)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
934 (cond
29423
12e89e9b65f6 (diff-font-lock-keywords, diff-hunk-header-re)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28858
diff changeset
935 ((looking-at "@@ -[0-9]+,\\([0-9]*\\) \\+[0-9]+,\\([0-9]*\\) @@.*$")
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
936 (let* ((old1 (match-string 1))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
937 (old2 (match-string 2))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
938 (new1 (number-to-string (+ space minus)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
939 (new2 (number-to-string (+ space plus))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
940 (unless (string= new2 old2) (replace-match new2 t t nil 2))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
941 (unless (string= new1 old1) (replace-match new1 t t nil 1))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
942 ((looking-at "--- \\([0-9]+\\),\\([0-9]*\\) ----$")
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
943 (when (> (+ space bang plus) 0)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
944 (let* ((old1 (match-string 1))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
945 (old2 (match-string 2))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
946 (new (number-to-string
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
947 (+ space bang plus -1 (string-to-number old1)))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
948 (unless (string= new old2) (replace-match new t t nil 2)))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
949 ((looking-at "\\*\\*\\* \\([0-9]+\\),\\(-?[0-9]*\\) \\*\\*\\*\\*$")
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
950 (when (> (+ space bang minus) 0)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
951 (let* ((old (match-string 1))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
952 (new (format
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
953 (concat "%0" (number-to-string (length old)) "d")
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
954 (+ space bang minus -1 (string-to-number old)))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
955 (unless (string= new old) (replace-match new t t nil 2))))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
956 (setq space 0 plus 0 minus 0 bang 0)))))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
957
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47523
diff changeset
958 ;;;;
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
959 ;;;; Hooks
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47523
diff changeset
960 ;;;;
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
961
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
962 (defun diff-write-contents-hooks ()
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
963 "Fixup hunk headers if necessary."
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
964 (if (buffer-modified-p) (diff-fixup-modifs (point-min) (point-max)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
965 nil)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
966
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
967 ;; It turns out that making changes in the buffer from within an
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
968 ;; *-change-function is asking for trouble, whereas making them
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
969 ;; from a post-command-hook doesn't pose much problems
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
970 (defvar diff-unhandled-changes nil)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
971 (defun diff-after-change-function (beg end len)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
972 "Remember to fixup the hunk header.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
973 See `after-change-functions' for the meaning of BEG, END and LEN."
29423
12e89e9b65f6 (diff-font-lock-keywords, diff-hunk-header-re)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28858
diff changeset
974 ;; Ignoring changes when inhibit-read-only is set is strictly speaking
12e89e9b65f6 (diff-font-lock-keywords, diff-hunk-header-re)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28858
diff changeset
975 ;; incorrect, but it turns out that inhibit-read-only is normally not set
12e89e9b65f6 (diff-font-lock-keywords, diff-hunk-header-re)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28858
diff changeset
976 ;; inside editing commands, while it tends to be set when the buffer gets
12e89e9b65f6 (diff-font-lock-keywords, diff-hunk-header-re)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28858
diff changeset
977 ;; updated by an async process or by a conversion function, both of which
12e89e9b65f6 (diff-font-lock-keywords, diff-hunk-header-re)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 28858
diff changeset
978 ;; would rather not be uselessly slowed down by this hook.
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
979 (when (and (not undo-in-progress) (not inhibit-read-only))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
980 (if diff-unhandled-changes
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
981 (setq diff-unhandled-changes
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
982 (cons (min beg (car diff-unhandled-changes))
46407
4c4398249108 (diff-reverse-direction): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42472
diff changeset
983 (max end (cdr diff-unhandled-changes))))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
984 (setq diff-unhandled-changes (cons beg end)))))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
985
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
986 (defun diff-post-command-hook ()
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
987 "Fixup hunk headers if necessary."
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
988 (when (consp diff-unhandled-changes)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
989 (ignore-errors
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
990 (save-excursion
27637
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
991 (goto-char (car diff-unhandled-changes))
46407
4c4398249108 (diff-reverse-direction): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42472
diff changeset
992 ;; Maybe we've cut the end of the hunk before point.
4c4398249108 (diff-reverse-direction): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42472
diff changeset
993 (if (and (bolp) (not (bobp))) (backward-char 1))
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
994 ;; We used to fixup modifs on all the changes, but it turns out
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
995 ;; that it's safer not to do it on big changes, for example
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
996 ;; when yanking a big diff, since we might then screw up perfectly
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
997 ;; correct values. -stef
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
998 ;; (unless (ignore-errors
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
999 ;; (diff-beginning-of-hunk)
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1000 ;; (save-excursion
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1001 ;; (diff-end-of-hunk)
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1002 ;; (> (point) (car diff-unhandled-changes))))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1003 ;; (goto-char (car diff-unhandled-changes))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1004 ;; (re-search-forward diff-hunk-header-re (cdr diff-unhandled-changes))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1005 ;; (diff-beginning-of-hunk))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1006 ;; (diff-fixup-modifs (point) (cdr diff-unhandled-changes))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1007 (diff-beginning-of-hunk)
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1008 (when (save-excursion
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1009 (diff-end-of-hunk)
46407
4c4398249108 (diff-reverse-direction): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42472
diff changeset
1010 (>= (point) (cdr diff-unhandled-changes)))
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1011 (diff-fixup-modifs (point) (cdr diff-unhandled-changes)))))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1012 (setq diff-unhandled-changes nil)))
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1013
55088
386e33861abd (diff-next-error): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54928
diff changeset
1014 (defun diff-next-error (arg reset)
386e33861abd (diff-next-error): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54928
diff changeset
1015 ;; Select a window that displays the current buffer so that point
386e33861abd (diff-next-error): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54928
diff changeset
1016 ;; movements are reflected in that window. Otherwise, the user might
386e33861abd (diff-next-error): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54928
diff changeset
1017 ;; never see the hunk corresponding to the source she's jumping to.
386e33861abd (diff-next-error): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54928
diff changeset
1018 (pop-to-buffer (current-buffer))
386e33861abd (diff-next-error): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54928
diff changeset
1019 (if reset (goto-char (point-min)))
386e33861abd (diff-next-error): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54928
diff changeset
1020 (diff-hunk-next arg)
386e33861abd (diff-next-error): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54928
diff changeset
1021 (diff-goto-source))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1022
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1023 ;;;###autoload
28240
a0b15838fd22 (diff-mode-*-map): use `easy-mmode-defmap'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27637
diff changeset
1024 (define-derived-mode diff-mode fundamental-mode "Diff"
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
1025 "Major mode for viewing/editing context diffs.
39386
50956864fe56 (diff-default-read-only): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39323
diff changeset
1026 Supports unified and context diffs as well as (to a lesser extent)
76982
3a37aeee9537 (diff-mode): Revert 2007-03-04 change.
Chong Yidong <cyd@stupidchicken.com>
parents: 76453
diff changeset
1027 normal diffs.
76323
0aef0bcf12f7 (diff-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 75727
diff changeset
1028
47445
d54b5b9a2b77 (diff-mode): Docstring improvement.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46407
diff changeset
1029 When the buffer is read-only, the ESC prefix is not necessary.
63415
3ed17f92f3c9 (diff-mode): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 63197
diff changeset
1030 If you edit the buffer manually, diff-mode will try to update the hunk
47445
d54b5b9a2b77 (diff-mode): Docstring improvement.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46407
diff changeset
1031 headers for you on-the-fly.
d54b5b9a2b77 (diff-mode): Docstring improvement.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46407
diff changeset
1032
d54b5b9a2b77 (diff-mode): Docstring improvement.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46407
diff changeset
1033 You can also switch between context diff and unified diff with \\[diff-context->unified],
66130
a6131b478689 (diff-mode): Doc fix.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 65287
diff changeset
1034 or vice versa with \\[diff-unified->context] and you can also reverse the direction of
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
1035 a diff with \\[diff-reverse-direction].
76323
0aef0bcf12f7 (diff-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 75727
diff changeset
1036
0aef0bcf12f7 (diff-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 75727
diff changeset
1037 \\{diff-mode-map}"
0aef0bcf12f7 (diff-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 75727
diff changeset
1038
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1039 (set (make-local-variable 'font-lock-defaults) diff-font-lock-defaults)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1040 (set (make-local-variable 'outline-regexp) diff-outline-regexp)
31269
64bb4634d6d8 (diff-mode) <defgroup>: Add :version.
Dave Love <fx@gnu.org>
parents: 30873
diff changeset
1041 (set (make-local-variable 'imenu-generic-expression)
64bb4634d6d8 (diff-mode) <defgroup>: Add :version.
Dave Love <fx@gnu.org>
parents: 30873
diff changeset
1042 diff-imenu-generic-expression)
31479
d58461428926 (diff-mouse-goto-source): New function.
Dave Love <fx@gnu.org>
parents: 31269
diff changeset
1043 ;; These are not perfect. They would be better done separately for
d58461428926 (diff-mouse-goto-source): New function.
Dave Love <fx@gnu.org>
parents: 31269
diff changeset
1044 ;; context diffs and unidiffs.
d58461428926 (diff-mouse-goto-source): New function.
Dave Love <fx@gnu.org>
parents: 31269
diff changeset
1045 ;; (set (make-local-variable 'paragraph-start)
d58461428926 (diff-mouse-goto-source): New function.
Dave Love <fx@gnu.org>
parents: 31269
diff changeset
1046 ;; (concat "@@ " ; unidiff hunk
d58461428926 (diff-mouse-goto-source): New function.
Dave Love <fx@gnu.org>
parents: 31269
diff changeset
1047 ;; "\\|\\*\\*\\* " ; context diff hunk or file start
d58461428926 (diff-mouse-goto-source): New function.
Dave Love <fx@gnu.org>
parents: 31269
diff changeset
1048 ;; "\\|--- [^\t]+\t")) ; context or unidiff file
d58461428926 (diff-mouse-goto-source): New function.
Dave Love <fx@gnu.org>
parents: 31269
diff changeset
1049 ;; ; start (first or second line)
d58461428926 (diff-mouse-goto-source): New function.
Dave Love <fx@gnu.org>
parents: 31269
diff changeset
1050 ;; (set (make-local-variable 'paragraph-separate) paragraph-start)
d58461428926 (diff-mouse-goto-source): New function.
Dave Love <fx@gnu.org>
parents: 31269
diff changeset
1051 ;; (set (make-local-variable 'page-delimiter) "--- [^\t]+\t")
d58461428926 (diff-mouse-goto-source): New function.
Dave Love <fx@gnu.org>
parents: 31269
diff changeset
1052 ;; compile support
55088
386e33861abd (diff-next-error): New fun.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54928
diff changeset
1053 (set (make-local-variable 'next-error-function) 'diff-next-error)
35526
b40a6cecc4d5 (diff-mode): Disable preliminary support for `compile'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33488
diff changeset
1054
71248
3071d2ae4624 * diff-mode.el (diff-mode): Set buffer-read-only to t when
Chong Yidong <cyd@stupidchicken.com>
parents: 70542
diff changeset
1055 (setq buffer-read-only diff-default-read-only)
27637
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
1056 ;; setup change hooks
37866
4e2d06e10072 (diff-jump-to-old-file, diff-update-on-the-fly):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37567
diff changeset
1057 (if (not diff-update-on-the-fly)
53833
32e20bdb34c9 (diff-file-regexp-alist, diff-error-regexp-alist)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53782
diff changeset
1058 (add-hook 'write-contents-functions 'diff-write-contents-hooks nil t)
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1059 (make-local-variable 'diff-unhandled-changes)
31973
ad9838a9349c (diff-mode-map, diff-minor-mode-prefix):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31819
diff changeset
1060 (add-hook 'after-change-functions 'diff-after-change-function nil t)
ad9838a9349c (diff-mode-map, diff-minor-mode-prefix):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31819
diff changeset
1061 (add-hook 'post-command-hook 'diff-post-command-hook nil t))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1062 ;; Neat trick from Dave Love to add more bindings in read-only mode:
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
1063 (lexical-let ((ro-bind (cons 'buffer-read-only diff-mode-shared-map)))
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1064 (add-to-list 'minor-mode-overriding-map-alist ro-bind)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1065 ;; Turn off this little trick in case the buffer is put in view-mode.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1066 (add-hook 'view-mode-hook
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
1067 (lambda ()
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
1068 (setq minor-mode-overriding-map-alist
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
1069 (delq ro-bind minor-mode-overriding-map-alist)))
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1070 nil t))
31795
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1071 ;; add-log support
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1072 (set (make-local-variable 'add-log-current-defun-function)
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1073 'diff-current-defun)
32012
b1edfcd919a7 (diff-add-log-file-name): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31973
diff changeset
1074 (set (make-local-variable 'add-log-buffer-file-name-function)
b1edfcd919a7 (diff-add-log-file-name): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31973
diff changeset
1075 'diff-find-file-name))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1076
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1077 ;;;###autoload
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
1078 (define-minor-mode diff-minor-mode
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
1079 "Minor mode for viewing/editing context diffs.
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
1080 \\{diff-minor-mode-map}"
61269
5d2796fc9f80 (diff-minor-mode): Specify :group.
Lute Kamstra <lute@gnu.org>
parents: 57418
diff changeset
1081 :group 'diff-mode :lighter " Diff"
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
1082 ;; FIXME: setup font-lock
27637
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
1083 ;; setup change hooks
37866
4e2d06e10072 (diff-jump-to-old-file, diff-update-on-the-fly):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37567
diff changeset
1084 (if (not diff-update-on-the-fly)
53833
32e20bdb34c9 (diff-file-regexp-alist, diff-error-regexp-alist)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53782
diff changeset
1085 (add-hook 'write-contents-functions 'diff-write-contents-hooks nil t)
27637
79014abee3cc (diff-kill-junk): New interactive function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26748
diff changeset
1086 (make-local-variable 'diff-unhandled-changes)
31973
ad9838a9349c (diff-mode-map, diff-minor-mode-prefix):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31819
diff changeset
1087 (add-hook 'after-change-functions 'diff-after-change-function nil t)
ad9838a9349c (diff-mode-map, diff-minor-mode-prefix):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31819
diff changeset
1088 (add-hook 'post-command-hook 'diff-post-command-hook nil t)))
26748
8b8438e9ac12 * diff-mode.el (diff-mode-shared-map): fset'd and doc change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 26009
diff changeset
1089
71556
31835ba46d29 (diff-find-file-name): Obey cvs-pcl-cvs-dirchange-re.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71249
diff changeset
1090 ;;; Handy hook functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1091
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1092 (defun diff-delete-if-empty ()
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1093 ;; An empty diff file means there's no more diffs to integrate, so we
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1094 ;; can just remove the file altogether. Very handy for .rej files if we
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1095 ;; remove hunks as we apply them.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1096 (when (and buffer-file-name
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1097 (eq 0 (nth 7 (file-attributes buffer-file-name))))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1098 (delete-file buffer-file-name)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1099
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1100 (defun diff-delete-empty-files ()
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1101 "Arrange for empty diff files to be removed."
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1102 (add-hook 'after-save-hook 'diff-delete-if-empty nil t))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1103
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1104 (defun diff-make-unified ()
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1105 "Turn context diffs into unified diffs if applicable."
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1106 (if (save-excursion
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1107 (goto-char (point-min))
55392
480f9d542579 (diff-make-unified): Fix regexp.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55322
diff changeset
1108 (and (looking-at diff-hunk-header-re) (eq (char-after) ?*)))
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1109 (let ((mod (buffer-modified-p)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1110 (unwind-protect
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1111 (diff-context->unified (point-min) (point-max))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1112 (restore-buffer-modified-p mod)))))
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1113
30873
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1114 ;;;
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1115 ;;; Misc operations that have proved useful at some point.
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1116 ;;;
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1117
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1118 (defun diff-next-complex-hunk ()
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1119 "Jump to the next \"complex\" hunk.
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1120 \"Complex\" is approximated by \"the hunk changes the number of lines\".
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1121 Only works for unified diffs."
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1122 (interactive)
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1123 (while
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1124 (and (re-search-forward "^@@ [-0-9]+,\\([0-9]+\\) [+0-9]+,\\([0-9]+\\) @@"
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1125 nil t)
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1126 (equal (match-string 1) (match-string 2)))))
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1127
75191
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1128 (defun diff-sanity-check-context-hunk-half (lines)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1129 (let ((count lines))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1130 (while
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1131 (cond
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1132 ((and (memq (char-after) '(?\s ?! ?+ ?-))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1133 (memq (char-after (1+ (point))) '(?\s ?\t)))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1134 (decf count) t)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1135 ((or (zerop count) (= count lines)) nil)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1136 ((memq (char-after) '(?! ?+ ?-))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1137 (if (not (and (eq (char-after (1+ (point))) ?\n)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1138 (y-or-n-p "Try to auto-fix whitespace loss damage? ")))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1139 (error "End of hunk ambiguously marked")
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1140 (forward-char 1) (insert " ") (forward-line -1) t))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1141 ((< lines 0)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1142 (error "End of hunk ambiguously marked"))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1143 ((not (y-or-n-p "Try to auto-fix whitespace loss and word-wrap damage? "))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1144 (error "Abort!"))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1145 ((eolp) (insert " ") (forward-line -1) t)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1146 (t (insert " ") (delete-region (- (point) 2) (- (point) 1)) t))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1147 (forward-line))))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1148
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1149 (defun diff-sanity-check-hunk ()
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1150 (let (;; Every modification is protected by a y-or-n-p, so it's probably
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1151 ;; OK to override a read-only setting.
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1152 (inhibit-read-only t))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1153 (save-excursion
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1154 (cond
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1155 ((not (looking-at diff-hunk-header-re))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1156 (error "Not recognizable hunk header"))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1157
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1158 ;; A context diff.
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1159 ((eq (char-after) ?*)
75727
612c9d0aab1d (diff-sanity-check-hunk): Fix last fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 75709
diff changeset
1160 (if (not (looking-at "\\*\\{15\\}\\(?: .*\\)?\n\\*\\*\\* \\([0-9]+\\),\\([0-9]+\\) \\*\\*\\*\\*"))
75191
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1161 (error "Unrecognized context diff first hunk header format")
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1162 (forward-line 2)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1163 (diff-sanity-check-context-hunk-half
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1164 (1+ (- (string-to-number (match-string 2))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1165 (string-to-number (match-string 1)))))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1166 (if (not (looking-at "--- \\([0-9]+\\),\\([0-9]+\\) ----$"))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1167 (error "Unrecognized context diff second hunk header format")
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1168 (forward-line)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1169 (diff-sanity-check-context-hunk-half
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1170 (1+ (- (string-to-number (match-string 2))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1171 (string-to-number (match-string 1))))))))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1172
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1173 ;; A unified diff.
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1174 ((eq (char-after) ?@)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1175 (if (not (looking-at
75709
75ea46f62d74 *** empty log message ***
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 75191
diff changeset
1176 "@@ -[0-9]+,\\([0-9]+\\) \\+[0-9]+,\\([0-9]+\\) @@"))
75191
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1177 (error "Unrecognized unified diff hunk header format")
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1178 (let ((before (string-to-number (match-string 1)))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1179 (after (string-to-number (match-string 2))))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1180 (forward-line)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1181 (while
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1182 (case (char-after)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1183 (?\s (decf before) (decf after) t)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1184 (?- (decf before) t)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1185 (?+ (decf after) t)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1186 (t
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1187 (cond
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1188 ((and (zerop before) (zerop after)) nil)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1189 ((or (< before 0) (< after 0))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1190 (error (if (or (zerop before) (zerop after))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1191 "End of hunk ambiguously marked"
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1192 "Hunk seriously messed up")))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1193 ((not (y-or-n-p "Try to auto-fix whitespace loss and word-wrap damage? "))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1194 (error "Abort!"))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1195 ((eolp) (insert " ") (forward-line -1) t)
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1196 (t (insert " ")
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1197 (delete-region (- (point) 2) (- (point) 1)) t))))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1198 (forward-line)))))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1199
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1200 ;; A plain diff.
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1201 (t
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1202 ;; TODO.
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1203 )))))
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1204
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1205 (defun diff-hunk-text (hunk destp char-offset)
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1206 "Return the literal source text from HUNK as (TEXT . OFFSET).
70542
ef7506f44a3a (diff-context->unified): Use `region-beginning' and `region-end'
Juri Linkov <juri@jurta.org>
parents: 70333
diff changeset
1207 If DESTP is nil, TEXT is the source, otherwise the destination text.
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1208 CHAR-OFFSET is a char-offset in HUNK, and OFFSET is the corresponding
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1209 char-offset in TEXT."
31556
74d7a9c42c2a (diff-hunk-text): Use `with-temp-buffer'.
Miles Bader <miles@gnu.org>
parents: 31538
diff changeset
1210 (with-temp-buffer
31819
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1211 (insert hunk)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1212 (goto-char (point-min))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1213 (let ((src-pos nil)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1214 (dst-pos nil)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1215 (divider-pos nil)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1216 (num-pfx-chars 2))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1217 ;; Set the following variables:
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1218 ;; SRC-POS buffer pos of the source part of the hunk or nil if none
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1219 ;; DST-POS buffer pos of the destination part of the hunk or nil
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1220 ;; DIVIDER-POS buffer pos of any divider line separating the src & dst
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1221 ;; NUM-PFX-CHARS number of line-prefix characters used by this format"
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1222 (cond ((looking-at "^@@")
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1223 ;; unified diff
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1224 (setq num-pfx-chars 1)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1225 (forward-line 1)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1226 (setq src-pos (point) dst-pos (point)))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1227 ((looking-at "^\\*\\*")
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1228 ;; context diff
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1229 (forward-line 2)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1230 (setq src-pos (point))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1231 (re-search-forward "^--- " nil t)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1232 (forward-line 0)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1233 (setq divider-pos (point))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1234 (forward-line 1)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1235 (setq dst-pos (point)))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1236 ((looking-at "^[0-9]+a[0-9,]+$")
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1237 ;; normal diff, insert
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1238 (forward-line 1)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1239 (setq dst-pos (point)))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1240 ((looking-at "^[0-9,]+d[0-9]+$")
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1241 ;; normal diff, delete
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1242 (forward-line 1)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1243 (setq src-pos (point)))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1244 ((looking-at "^[0-9,]+c[0-9,]+$")
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1245 ;; normal diff, change
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1246 (forward-line 1)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1247 (setq src-pos (point))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1248 (re-search-forward "^---$" nil t)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1249 (forward-line 0)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1250 (setq divider-pos (point))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1251 (forward-line 1)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1252 (setq dst-pos (point)))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1253 (t
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1254 (error "Unknown diff hunk type")))
30873
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1255
31819
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1256 (if (if destp (null dst-pos) (null src-pos))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1257 ;; Implied empty text
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1258 (if char-offset '("" . 0) "")
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1259
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1260 ;; For context diffs, either side can be empty, (if there's only
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1261 ;; added or only removed text). We should then use the other side.
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1262 (cond ((equal src-pos divider-pos) (setq src-pos dst-pos))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1263 ((equal dst-pos (point-max)) (setq dst-pos src-pos)))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1264
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1265 (when char-offset (goto-char (+ (point-min) char-offset)))
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1266
31819
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1267 ;; Get rid of anything except the desired text.
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1268 (save-excursion
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1269 ;; Delete unused text region
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1270 (let ((keep (if destp dst-pos src-pos)))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1271 (when (and divider-pos (> divider-pos keep))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1272 (delete-region divider-pos (point-max)))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1273 (delete-region (point-min) keep))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1274 ;; Remove line-prefix characters, and unneeded lines (unified diffs).
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1275 (let ((kill-char (if destp ?- ?+)))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1276 (goto-char (point-min))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1277 (while (not (eobp))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1278 (if (eq (char-after) kill-char)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1279 (delete-region (point) (progn (forward-line 1) (point)))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1280 (delete-char num-pfx-chars)
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1281 (forward-line 1)))))
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1282
31819
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1283 (let ((text (buffer-substring-no-properties (point-min) (point-max))))
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1284 (if char-offset (cons text (- (point) (point-min))) text))))))
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1285
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1286
31734
6b057ae8165d Docstring fixes.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31705
diff changeset
1287 (defun diff-find-text (text)
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1288 "Return the buffer position (BEG . END) of the nearest occurrence of TEXT.
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1289 If TEXT isn't found, nil is returned."
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1290 (let* ((orig (point))
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1291 (forw (and (search-forward text nil t)
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1292 (cons (match-beginning 0) (match-end 0))))
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1293 (back (and (goto-char (+ orig (length text)))
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1294 (search-backward text nil t)
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1295 (cons (match-beginning 0) (match-end 0)))))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1296 ;; Choose the closest match.
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1297 (if (and forw back)
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1298 (if (> (- (car forw) orig) (- orig (car back))) back forw)
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1299 (or back forw))))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1300
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1301 (defun diff-find-approx-text (text)
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1302 "Return the buffer position (BEG . END) of the nearest occurrence of TEXT.
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1303 Whitespace differences are ignored."
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1304 (let* ((orig (point))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1305 (re (concat "^[ \t\n ]*"
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1306 (mapconcat 'regexp-quote (split-string text) "[ \t\n ]+")
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1307 "[ \t\n ]*\n"))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1308 (forw (and (re-search-forward re nil t)
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1309 (cons (match-beginning 0) (match-end 0))))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1310 (back (and (goto-char (+ orig (length text)))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1311 (re-search-backward re nil t)
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1312 (cons (match-beginning 0) (match-end 0)))))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1313 ;; Choose the closest match.
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1314 (if (and forw back)
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1315 (if (> (- (car forw) orig) (- orig (car back))) back forw)
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1316 (or back forw))))
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1317
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1318 (defsubst diff-xor (a b) (if a (not b) b))
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1319
31786
181947e98152 (diff-find-source-location):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31749
diff changeset
1320 (defun diff-find-source-location (&optional other-file reverse)
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1321 "Find out (BUF LINE-OFFSET POS SRC DST SWITCHED).
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1322 BUF is the buffer corresponding to the source file.
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1323 LINE-OFFSET is the offset between the expected and actual positions
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1324 of the text of the hunk or nil if the text was not found.
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1325 POS is a pair (BEG . END) indicating the position of the text in the buffer.
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1326 SRC and DST are the two variants of text as returned by `diff-hunk-text'.
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1327 SRC is the variant that was found in the buffer.
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1328 SWITCHED is non-nil if the patch is already applied."
31735
9d50fe5df6ce Moved closer to its users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31734
diff changeset
1329 (save-excursion
37866
4e2d06e10072 (diff-jump-to-old-file, diff-update-on-the-fly):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37567
diff changeset
1330 (let* ((other (diff-xor other-file diff-jump-to-old-file))
78359
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
1331 (char-offset (- (point) (progn (diff-beginning-of-hunk 'try-harder)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
1332 (point))))
75191
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1333 ;; Check that the hunk is well-formed. Otherwise diff-mode and
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1334 ;; the user may disagree on what constitutes the hunk
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1335 ;; (e.g. because an empty line truncates the hunk mid-course),
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1336 ;; leading to potentially nasty surprises for the user.
98ad9ce30ba1 (diff-sanity-check-context-hunk-half, diff-sanity-check-hunk): New functions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 74269
diff changeset
1337 (_ (diff-sanity-check-hunk))
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1338 (hunk (buffer-substring (point)
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1339 (save-excursion (diff-end-of-hunk) (point))))
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1340 (old (diff-hunk-text hunk reverse char-offset))
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1341 (new (diff-hunk-text hunk (not reverse) char-offset))
31735
9d50fe5df6ce Moved closer to its users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31734
diff changeset
1342 ;; Find the location specification.
31786
181947e98152 (diff-find-source-location):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31749
diff changeset
1343 (line (if (not (looking-at "\\(?:\\*\\{15\\}.*\n\\)?[-@* ]*\\([0-9,]+\\)\\([ acd+]+\\([0-9,]+\\)\\)?"))
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1344 (error "Can't find the hunk header")
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1345 (if other (match-string 1)
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1346 (if (match-end 3) (match-string 3)
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1347 (unless (re-search-forward "^--- \\([0-9,]+\\)" nil t)
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1348 (error "Can't find the hunk separator"))
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1349 (match-string 1)))))
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1350 (file (or (diff-find-file-name other) (error "Can't find the file")))
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1351 (buf (find-file-noselect file)))
31735
9d50fe5df6ce Moved closer to its users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31734
diff changeset
1352 ;; Update the user preference if he so wished.
9d50fe5df6ce Moved closer to its users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31734
diff changeset
1353 (when (> (prefix-numeric-value other-file) 8)
37866
4e2d06e10072 (diff-jump-to-old-file, diff-update-on-the-fly):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37567
diff changeset
1354 (setq diff-jump-to-old-file other))
31786
181947e98152 (diff-find-source-location):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31749
diff changeset
1355 (with-current-buffer buf
181947e98152 (diff-find-source-location):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31749
diff changeset
1356 (goto-line (string-to-number line))
181947e98152 (diff-find-source-location):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31749
diff changeset
1357 (let* ((orig-pos (point))
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1358 (switched nil)
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1359 ;; FIXME: Check for case where both OLD and NEW are found.
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1360 (pos (or (diff-find-text (car old))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1361 (progn (setq switched t) (diff-find-text (car new)))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1362 (progn (setq switched nil)
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1363 (condition-case nil
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1364 (diff-find-approx-text (car old))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1365 (invalid-regexp nil))) ;Regex too big.
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1366 (progn (setq switched t)
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1367 (condition-case nil
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1368 (diff-find-approx-text (car new))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1369 (invalid-regexp nil))) ;Regex too big.
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1370 (progn (setq switched nil) nil))))
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1371 (nconc
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1372 (list buf)
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1373 (if pos
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1374 (list (count-lines orig-pos (car pos)) pos)
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1375 (list nil (cons orig-pos (+ orig-pos (length (car old))))))
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1376 (if switched (list new old t) (list old new))))))))
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1377
31735
9d50fe5df6ce Moved closer to its users.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31734
diff changeset
1378
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1379 (defun diff-hunk-status-msg (line-offset reversed dry-run)
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1380 (let ((msg (if dry-run
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1381 (if reversed "already applied" "not yet applied")
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1382 (if reversed "undone" "applied"))))
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1383 (message (cond ((null line-offset) "Hunk text not found")
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1384 ((= line-offset 0) "Hunk %s")
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1385 ((= line-offset 1) "Hunk %s at offset %d line")
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1386 (t "Hunk %s at offset %d lines"))
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1387 msg line-offset)))
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1388
72813
200db4ae9b54 (diff-apply-hunk-to-backup-file): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71556
diff changeset
1389 (defvar diff-apply-hunk-to-backup-file nil)
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1390
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1391 (defun diff-apply-hunk (&optional reverse)
31819
e5a0c7120611 (diff-hunk-text): Properly handle one-sided context diffs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31817
diff changeset
1392 "Apply the current hunk to the source file and go to the next.
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1393 By default, the new source file is patched, but if the variable
37866
4e2d06e10072 (diff-jump-to-old-file, diff-update-on-the-fly):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37567
diff changeset
1394 `diff-jump-to-old-file' is non-nil, then the old source file is
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1395 patched instead (some commands, such as `diff-goto-source' can change
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1396 the value of this variable when given an appropriate prefix argument).
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1397
32063
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1398 With a prefix argument, REVERSE the hunk."
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1399 (interactive "P")
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1400 (destructuring-bind (buf line-offset pos old new &optional switched)
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1401 ;; If REVERSE go to the new file, otherwise go to the old.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1402 (diff-find-source-location (not reverse) reverse)
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1403 (cond
32063
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1404 ((null line-offset)
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1405 (error "Can't find the text to patch"))
72813
200db4ae9b54 (diff-apply-hunk-to-backup-file): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71556
diff changeset
1406 ((with-current-buffer buf
200db4ae9b54 (diff-apply-hunk-to-backup-file): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71556
diff changeset
1407 (and buffer-file-name
200db4ae9b54 (diff-apply-hunk-to-backup-file): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71556
diff changeset
1408 (backup-file-name-p buffer-file-name)
200db4ae9b54 (diff-apply-hunk-to-backup-file): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71556
diff changeset
1409 (not diff-apply-hunk-to-backup-file)
200db4ae9b54 (diff-apply-hunk-to-backup-file): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71556
diff changeset
1410 (not (set (make-local-variable 'diff-apply-hunk-to-backup-file)
200db4ae9b54 (diff-apply-hunk-to-backup-file): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71556
diff changeset
1411 (yes-or-no-p (format "Really apply this hunk to %s? "
200db4ae9b54 (diff-apply-hunk-to-backup-file): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71556
diff changeset
1412 (file-name-nondirectory
200db4ae9b54 (diff-apply-hunk-to-backup-file): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71556
diff changeset
1413 buffer-file-name)))))))
76453
5e29de959ce6 (diff-apply-hunk): Use proper format string for
Andreas Schwab <schwab@suse.de>
parents: 76323
diff changeset
1414 (error "%s"
5e29de959ce6 (diff-apply-hunk): Use proper format string for
Andreas Schwab <schwab@suse.de>
parents: 76323
diff changeset
1415 (substitute-command-keys
72813
200db4ae9b54 (diff-apply-hunk-to-backup-file): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71556
diff changeset
1416 (format "Use %s\\[diff-apply-hunk] to apply it to the other file"
200db4ae9b54 (diff-apply-hunk-to-backup-file): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 71556
diff changeset
1417 (if (not reverse) "\\[universal-argument] ")))))
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1418 ((and switched
35526
b40a6cecc4d5 (diff-mode): Disable preliminary support for `compile'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 33488
diff changeset
1419 ;; A reversed patch was detected, perhaps apply it in reverse.
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1420 (not (save-window-excursion
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1421 (pop-to-buffer buf)
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1422 (goto-char (+ (car pos) (cdr old)))
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1423 (y-or-n-p
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1424 (if reverse
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1425 "Hunk hasn't been applied yet; apply it now? "
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1426 "Hunk has already been applied; undo it? ")))))
32063
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1427 (message "(Nothing done)"))
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1428 (t
32063
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1429 ;; Apply the hunk
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1430 (with-current-buffer buf
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1431 (goto-char (car pos))
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1432 (delete-region (car pos) (cdr pos))
32063
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1433 (insert (car new)))
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1434 ;; Display BUF in a window
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1435 (set-window-point (display-buffer buf) (+ (car pos) (cdr new)))
32063
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1436 (diff-hunk-status-msg line-offset (diff-xor switched reverse) nil)
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1437 (when diff-advance-after-apply-hunk
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1438 (diff-hunk-next))))))
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1439
31684
e05ee0693dda (diff-hunk-text):
Miles Bader <miles@gnu.org>
parents: 31556
diff changeset
1440
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1441 (defun diff-test-hunk (&optional reverse)
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1442 "See whether it's possible to apply the current hunk.
32063
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1443 With a prefix argument, try to REVERSE the hunk."
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1444 (interactive "P")
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1445 (destructuring-bind (buf line-offset pos src dst &optional switched)
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1446 ;; If REVERSE go to the new file, otherwise go to the old.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1447 (diff-find-source-location (not reverse) reverse)
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1448 (set-window-point (display-buffer buf) (+ (car pos) (cdr src)))
32063
3fb2a3b13c5e (diff-test-hunk): Backout previous change. Fix doc string.
Miles Bader <miles@gnu.org>
parents: 32061
diff changeset
1449 (diff-hunk-status-msg line-offset (diff-xor reverse switched) t)))
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1450
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1451
54869
c491468e3c18 (diff-goto-source): Make it work for mouse bindings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54693
diff changeset
1452 (defalias 'diff-mouse-goto-source 'diff-goto-source)
c491468e3c18 (diff-goto-source): Make it work for mouse bindings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54693
diff changeset
1453
c491468e3c18 (diff-goto-source): Make it work for mouse bindings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54693
diff changeset
1454 (defun diff-goto-source (&optional other-file event)
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1455 "Jump to the corresponding source line.
37866
4e2d06e10072 (diff-jump-to-old-file, diff-update-on-the-fly):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 37567
diff changeset
1456 `diff-jump-to-old-file' (or its opposite if the OTHER-FILE prefix arg
31795
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1457 is given) determines whether to jump to the old or the new file.
31538
46aca282e6b0 (diff-apply-hunk): Function basically rewritten. Now understands
Miles Bader <miles@gnu.org>
parents: 31479
diff changeset
1458 If the prefix arg is bigger than 8 (for example with \\[universal-argument] \\[universal-argument])
70542
ef7506f44a3a (diff-context->unified): Use `region-beginning' and `region-end'
Juri Linkov <juri@jurta.org>
parents: 70333
diff changeset
1459 then `diff-jump-to-old-file' is also set, for the next invocations."
54869
c491468e3c18 (diff-goto-source): Make it work for mouse bindings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54693
diff changeset
1460 (interactive (list current-prefix-arg last-input-event))
32111
161c2ec9f5b2 (diff-font-lock-keywords): Minor regex fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32063
diff changeset
1461 ;; When pointing at a removal line, we probably want to jump to
161c2ec9f5b2 (diff-font-lock-keywords): Minor regex fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32063
diff changeset
1462 ;; the old location, and else to the new (i.e. as if reverting).
161c2ec9f5b2 (diff-font-lock-keywords): Minor regex fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32063
diff changeset
1463 ;; This is a convenient detail when using smerge-diff.
54869
c491468e3c18 (diff-goto-source): Make it work for mouse bindings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 54693
diff changeset
1464 (if event (posn-set-point (event-end event)))
32111
161c2ec9f5b2 (diff-font-lock-keywords): Minor regex fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32063
diff changeset
1465 (let ((rev (not (save-excursion (beginning-of-line) (looking-at "[-<]")))))
161c2ec9f5b2 (diff-font-lock-keywords): Minor regex fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32063
diff changeset
1466 (destructuring-bind (buf line-offset pos src dst &optional switched)
161c2ec9f5b2 (diff-font-lock-keywords): Minor regex fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32063
diff changeset
1467 (diff-find-source-location other-file rev)
161c2ec9f5b2 (diff-font-lock-keywords): Minor regex fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 32063
diff changeset
1468 (pop-to-buffer buf)
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1469 (goto-char (+ (car pos) (cdr src)))
32143
299f601ca8ba (diff-goto-source):
Miles Bader <miles@gnu.org>
parents: 32111
diff changeset
1470 (diff-hunk-status-msg line-offset (diff-xor rev switched) t))))
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1471
31786
181947e98152 (diff-find-source-location):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31749
diff changeset
1472
31795
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1473 (defun diff-current-defun ()
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1474 "Find the name of function at point.
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1475 For use in `add-log-current-defun-function'."
56073
dc1d86d80c20 Reindent `diff-current-defun'.
Kai Großjohann <kgrossjo@eu.uu.net>
parents: 56072
diff changeset
1476 (save-excursion
dc1d86d80c20 Reindent `diff-current-defun'.
Kai Großjohann <kgrossjo@eu.uu.net>
parents: 56072
diff changeset
1477 (when (looking-at diff-hunk-header-re)
dc1d86d80c20 Reindent `diff-current-defun'.
Kai Großjohann <kgrossjo@eu.uu.net>
parents: 56072
diff changeset
1478 (forward-line 1)
57418
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
1479 (re-search-forward "^[^ ]" nil t))
56073
dc1d86d80c20 Reindent `diff-current-defun'.
Kai Großjohann <kgrossjo@eu.uu.net>
parents: 56072
diff changeset
1480 (destructuring-bind (buf line-offset pos src dst &optional switched)
dc1d86d80c20 Reindent `diff-current-defun'.
Kai Großjohann <kgrossjo@eu.uu.net>
parents: 56072
diff changeset
1481 (diff-find-source-location)
31795
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1482 (beginning-of-line)
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1483 (or (when (memq (char-after) '(?< ?-))
31817
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1484 ;; Cursor is pointing at removed text. This could be a removed
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1485 ;; function, in which case, going to the source buffer will
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1486 ;; not help since the function is now removed. Instead,
e23774b771e1 (diff-file-header-face): Reset to its previous value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31795
diff changeset
1487 ;; try to figure out the function name just from the code-fragment.
31795
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1488 (let ((old (if switched dst src)))
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1489 (with-temp-buffer
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1490 (insert (car old))
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1491 (funcall (with-current-buffer buf major-mode))
46407
4c4398249108 (diff-reverse-direction): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 42472
diff changeset
1492 (goto-char (+ (point-min) (cdr old)))
31795
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1493 (add-log-current-defun))))
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1494 (with-current-buffer buf
41526
f0fb05d40941 (diff-end-of-hunk): Watch out for ambiguities.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 39386
diff changeset
1495 (goto-char (+ (car pos) (cdr src)))
31795
868648c4a36b * diff-mode.el (diff-add-log-file-name, diff-current-defun): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31786
diff changeset
1496 (add-log-current-defun))))))
30873
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1497
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1498 (defun diff-refine-hunk ()
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1499 "Refine the current hunk by ignoring space differences."
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1500 (interactive)
78359
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
1501 (let* ((char-offset (- (point) (progn (diff-beginning-of-hunk 'try-harder)
2dd5d799a16d * vc-git.el: (vc-directory-exclusion-list, vc-handled-backends):
Dan Nicolaescu <dann@ics.uci.edu>
parents: 78236
diff changeset
1502 (point))))
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1503 (opts (case (char-after) (?@ "-bu") (?* "-bc") (t "-b")))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1504 (line-nb (and (or (looking-at "[^0-9]+\\([0-9]+\\)")
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1505 (error "Can't find line number"))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1506 (string-to-number (match-string 1))))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1507 (hunk (delete-and-extract-region
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1508 (point) (save-excursion (diff-end-of-hunk) (point))))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1509 (lead (make-string (1- line-nb) ?\n)) ;Line nums start at 1.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1510 (file1 (make-temp-file "diff1"))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1511 (file2 (make-temp-file "diff2"))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1512 (coding-system-for-read buffer-file-coding-system)
71249
3798a822991e * diff-mode.el (diff-hunk-kill, diff-file-kill, diff-split-hunk)
Chong Yidong <cyd@stupidchicken.com>
parents: 71248
diff changeset
1513 (inhibit-read-only t)
54528
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1514 old new)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1515 (unwind-protect
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1516 (save-excursion
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1517 (setq old (diff-hunk-text hunk nil char-offset))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1518 (setq new (diff-hunk-text hunk t char-offset))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1519 (write-region (concat lead (car old)) nil file1 nil 'nomessage)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1520 (write-region (concat lead (car new)) nil file2 nil 'nomessage)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1521 (with-temp-buffer
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1522 (let ((status
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1523 (call-process diff-command nil t nil
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1524 opts file1 file2)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1525 (case status
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1526 (0 nil) ;Nothing to reformat.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1527 (1 (goto-char (point-min))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1528 ;; Remove the file-header.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1529 (when (re-search-forward diff-hunk-header-re nil t)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1530 (delete-region (point-min) (match-beginning 0))))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1531 (t (goto-char (point-max))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1532 (unless (bolp) (insert "\n"))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1533 (insert hunk)))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1534 (setq hunk (buffer-string))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1535 (unless (memq status '(0 1))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1536 (error "Diff returned: %s" status)))))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1537 ;; Whatever happens, put back some equivalent text: either the new
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1538 ;; one or the original one in case some error happened.
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1539 (insert hunk)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1540 (delete-file file1)
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1541 (delete-file file2))))
67419634950d (diff-default-read-only): Change default.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 53833
diff changeset
1542
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1543 ;; provide the package
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1544 (provide 'diff-mode)
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1545
30873
7f824fa01e10 (diff-mode-map): Bind diff-apply-hunk.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29423
diff changeset
1546 ;;; Old Change Log from when diff-mode wasn't part of Emacs:
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1547 ;; Revision 1.11 1999/10/09 23:38:29 monnier
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1548 ;; (diff-mode-load-hook): dropped.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1549 ;; (auto-mode-alist): also catch *.diffs.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1550 ;; (diff-find-file-name, diff-mode): add smarts to find the right file
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1551 ;; for *.rej files (that lack any file name indication).
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1552 ;;
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1553 ;; Revision 1.10 1999/09/30 15:32:11 monnier
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1554 ;; added support for "\ No newline at end of file".
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1555 ;;
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1556 ;; Revision 1.9 1999/09/15 00:01:13 monnier
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1557 ;; - added basic `compile' support.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1558 ;; - have diff-kill-hunk call diff-kill-file if it's the only hunk.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1559 ;; - diff-kill-file now tries to kill the leading garbage as well.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1560 ;;
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1561 ;; Revision 1.8 1999/09/13 21:10:09 monnier
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1562 ;; - don't use CL in the autoloaded code
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1563 ;; - accept diffs using -T
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1564 ;;
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1565 ;; Revision 1.7 1999/09/05 20:53:03 monnier
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1566 ;; interface to ediff-patch
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1567 ;;
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1568 ;; Revision 1.6 1999/09/01 20:55:13 monnier
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1569 ;; (ediff=patch-file): add bindings to call ediff-patch.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1570 ;; (diff-find-file-name): taken out of diff-goto-source.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1571 ;; (diff-unified->context, diff-context->unified, diff-reverse-direction,
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1572 ;; diff-fixup-modifs): only use the region if a prefix arg is given.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1573 ;;
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1574 ;; Revision 1.5 1999/08/31 19:18:52 monnier
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1575 ;; (diff-beginning-of-file, diff-prev-file): fixed wrong parenthesis.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1576 ;;
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1577 ;; Revision 1.4 1999/08/31 13:01:44 monnier
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1578 ;; use `combine-after-change-calls' to minimize the slowdown of font-lock.
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1579 ;;
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1580
57418
3a8c458de33d (diff-current-defun): Fix 2004-06-13's change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 57279
diff changeset
1581 ;; arch-tag: 2571d7ff-bc28-4cf9-8585-42e21890be66
25959
1c62cbeca833 Initial revision, known outside of Emacs as version 1.8.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff changeset
1582 ;;; diff-mode.el ends here