2011-02-26 10:19:08 -05:00
|
|
|
|
;;; diff-mode.el --- a mode for viewing/editing context diffs -*- lexical-binding: t -*-
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2021-01-01 01:13:56 -08:00
|
|
|
|
;; Copyright (C) 1998-2021 Free Software Foundation, Inc.
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2006-04-30 15:49:08 +00:00
|
|
|
|
;; Author: Stefan Monnier <monnier@iro.umontreal.ca>
|
* lisp/finder.el (finder-known-keywords): Add keyword "vc"
for version control.
* add-log.el, cvs-status.el, diff.el, diff-mode.el, ediff.el,
* emerge.el, log-edit.el, log-view.el, pcvs.el, smerge-mode.el,
* vc-annotate.el, vc-bzr.el, vc-dir.el, vc-dispatcher.el, vc-git.el,
* vc-hg.el, vc-mtn.el, vc.el: Add keyword "vc".
2010-06-11 22:09:57 +03:00
|
|
|
|
;; Keywords: convenience patch diff vc
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
|
2008-05-06 08:06:51 +00:00
|
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;; it under the terms of the GNU General Public License as published by
|
2008-05-06 08:06:51 +00:00
|
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
;; (at your option) any later version.
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
;; GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
2017-09-13 15:52:52 -07:00
|
|
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
|
2001-01-24 23:26:40 +00:00
|
|
|
|
;; Provides support for font-lock, outline, navigation
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;; commands, editing and various conversions as well as jumping
|
|
|
|
|
;; to the corresponding source file.
|
|
|
|
|
|
2004-02-06 22:05:16 +00:00
|
|
|
|
;; Inspired by Pavel Machek's patch-mode.el (<pavel@@atrey.karlin.mff.cuni.cz>)
|
2012-02-28 00:17:21 -08:00
|
|
|
|
;; Some efforts were spent to have it somewhat compatible with XEmacs's
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;; diff-mode as well as with compilation-minor-mode
|
|
|
|
|
|
|
|
|
|
;; Bugs:
|
|
|
|
|
|
2000-08-16 19:56:10 +00:00
|
|
|
|
;; - Reverse doesn't work with normal diffs.
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
;; Todo:
|
|
|
|
|
|
2008-02-05 02:14:10 +00:00
|
|
|
|
;; - Improve `diff-add-change-log-entries-other-window',
|
|
|
|
|
;; it is very simplistic now.
|
2008-12-03 05:48:14 +00:00
|
|
|
|
;;
|
2004-03-23 20:50:36 +00:00
|
|
|
|
;; - Add a `delete-after-apply' so C-c C-a automatically deletes hunks.
|
|
|
|
|
;; Also allow C-c C-a to delete already-applied hunks.
|
|
|
|
|
;;
|
|
|
|
|
;; - Try `diff <file> <hunk>' to try and fuzzily discover the source location
|
|
|
|
|
;; of a hunk. Show then the changes between <file> and <hunk> and make it
|
|
|
|
|
;; possible to apply them to <file>, <hunk-src>, or <hunk-dst>.
|
|
|
|
|
;; Or maybe just make it into a ".rej to diff3-markers converter".
|
2006-07-02 14:29:28 +00:00
|
|
|
|
;; Maybe just use `wiggle' (by Neil Brown) to do it for us.
|
2004-03-23 20:50:36 +00:00
|
|
|
|
;;
|
2006-07-02 14:29:28 +00:00
|
|
|
|
;; - in diff-apply-hunk, strip context in replace-match to better
|
|
|
|
|
;; preserve markers and spacing.
|
2000-08-16 19:56:10 +00:00
|
|
|
|
;; - Handle `diff -b' output in context->unified.
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
;;; Code:
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(eval-when-compile (require 'cl-lib))
|
2019-07-04 20:32:39 -04:00
|
|
|
|
(eval-when-compile (require 'subr-x))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2018-11-14 02:14:52 +02:00
|
|
|
|
(autoload 'vc-find-revision "vc")
|
2018-12-18 01:11:15 +02:00
|
|
|
|
(autoload 'vc-find-revision-no-save "vc")
|
2018-11-14 02:23:04 +02:00
|
|
|
|
(defvar vc-find-revision-no-save)
|
2005-08-31 13:47:51 +00:00
|
|
|
|
(defvar add-log-buffer-file-name-function)
|
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
(defgroup diff-mode ()
|
2005-07-04 01:55:56 +00:00
|
|
|
|
"Major mode for viewing/editing diffs."
|
2000-08-29 14:38:49 +00:00
|
|
|
|
:version "21.1"
|
1999-10-09 23:52:39 +00:00
|
|
|
|
:group 'tools
|
|
|
|
|
:group 'diff)
|
|
|
|
|
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(defcustom diff-default-read-only nil
|
2001-09-22 19:11:24 +00:00
|
|
|
|
"If non-nil, `diff-mode' buffers default to being read-only."
|
2018-07-10 22:52:21 -04:00
|
|
|
|
:type 'boolean)
|
2001-09-22 19:11:24 +00:00
|
|
|
|
|
2001-05-21 18:45:05 +00:00
|
|
|
|
(defcustom diff-jump-to-old-file nil
|
2007-05-08 16:07:32 +00:00
|
|
|
|
"Non-nil means `diff-goto-source' jumps to the old file.
|
1999-10-09 23:52:39 +00:00
|
|
|
|
Else, it jumps to the new file."
|
2018-07-10 22:52:21 -04:00
|
|
|
|
:type 'boolean)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2001-05-21 18:45:05 +00:00
|
|
|
|
(defcustom diff-update-on-the-fly t
|
2008-12-03 05:48:14 +00:00
|
|
|
|
"Non-nil means hunk headers are kept up-to-date on-the-fly.
|
1999-10-09 23:52:39 +00:00
|
|
|
|
When editing a diff file, the line numbers in the hunk headers
|
|
|
|
|
need to be kept consistent with the actual diff. This can
|
|
|
|
|
either be done on the fly (but this sometimes interacts poorly with the
|
|
|
|
|
undo mechanism) or whenever the file is written (can be slow
|
2020-10-16 08:46:07 +02:00
|
|
|
|
when editing big diffs).
|
|
|
|
|
|
|
|
|
|
If this variable is nil, the hunk header numbers are updated when
|
|
|
|
|
the file is written instead."
|
2018-07-10 22:52:21 -04:00
|
|
|
|
:type 'boolean)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2000-10-02 03:48:38 +00:00
|
|
|
|
(defcustom diff-advance-after-apply-hunk t
|
2008-12-03 05:48:14 +00:00
|
|
|
|
"Non-nil means `diff-apply-hunk' will move to the next hunk after applying."
|
2018-07-10 22:52:21 -04:00
|
|
|
|
:type 'boolean)
|
2000-10-02 03:48:38 +00:00
|
|
|
|
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(defcustom diff-mode-hook nil
|
|
|
|
|
"Run after setting up the `diff-mode' major mode."
|
|
|
|
|
:type 'hook
|
2018-07-10 22:52:21 -04:00
|
|
|
|
:options '(diff-delete-empty-files diff-make-unified))
|
|
|
|
|
|
2019-02-24 16:13:13 +01:00
|
|
|
|
(defcustom diff-refine 'font-lock
|
|
|
|
|
"If non-nil, enable hunk refinement.
|
|
|
|
|
|
|
|
|
|
The value `font-lock' means to refine during font-lock.
|
|
|
|
|
The value `navigation' means to refine each hunk as you visit it
|
|
|
|
|
with `diff-hunk-next' or `diff-hunk-prev'.
|
|
|
|
|
|
|
|
|
|
You can always manually refine a hunk with `diff-refine-hunk'."
|
2018-07-10 22:52:21 -04:00
|
|
|
|
:version "27.1"
|
2019-02-24 16:13:13 +01:00
|
|
|
|
:type '(choice (const :tag "Don't refine hunks" nil)
|
|
|
|
|
(const :tag "Refine hunks during font-lock" font-lock)
|
|
|
|
|
(const :tag "Refine hunks during navigation" navigation)))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2018-07-13 12:34:50 -04:00
|
|
|
|
(defcustom diff-font-lock-prettify nil
|
2019-08-13 18:16:51 +03:00
|
|
|
|
"If non-nil, font-lock will try and make the format prettier.
|
|
|
|
|
|
|
|
|
|
This mimics the Magit's diff format by making the hunk header
|
|
|
|
|
less cryptic, and on GUI frames also displays insertion and
|
|
|
|
|
deletion indicators on the left fringe (if it's available)."
|
2018-07-13 12:34:50 -04:00
|
|
|
|
:version "27.1"
|
|
|
|
|
:type 'boolean)
|
|
|
|
|
|
2018-12-18 01:11:15 +02:00
|
|
|
|
(defcustom diff-font-lock-syntax t
|
|
|
|
|
"If non-nil, diff hunk font-lock includes source language syntax highlighting.
|
|
|
|
|
This highlighting is the same as added by `font-lock-mode'
|
|
|
|
|
when corresponding source files are visited normally.
|
2019-04-09 18:39:22 -04:00
|
|
|
|
Syntax highlighting is added over diff-mode's own highlighted changes.
|
2018-12-18 01:11:15 +02:00
|
|
|
|
|
|
|
|
|
If t, the default, highlight syntax only in Diff buffers created by Diff
|
|
|
|
|
commands that compare files or by VC commands that compare revisions.
|
|
|
|
|
These provide all necessary context for reliable highlighting. This value
|
|
|
|
|
requires support from a VC backend to find the files being compared.
|
|
|
|
|
For diffs against the working-tree version of a file, the highlighting is
|
|
|
|
|
based on the current file contents. File-based fontification tries to
|
|
|
|
|
infer fontification from the compared files.
|
|
|
|
|
|
2019-04-09 18:39:22 -04:00
|
|
|
|
If `hunk-only' fontification is based on hunk alone, without full source.
|
2018-12-18 01:11:15 +02:00
|
|
|
|
It tries to highlight hunks without enough context that sometimes might result
|
2019-04-09 18:39:22 -04:00
|
|
|
|
in wrong fontification. This is the fastest option, but less reliable.
|
|
|
|
|
|
|
|
|
|
If `hunk-also', use reliable file-based syntax highlighting when available
|
|
|
|
|
and hunk-based syntax highlighting otherwise as a fallback."
|
2018-12-18 01:11:15 +02:00
|
|
|
|
:version "27.1"
|
|
|
|
|
:type '(choice (const :tag "Don't highlight syntax" nil)
|
|
|
|
|
(const :tag "Hunk-based only" hunk-only)
|
2019-04-09 18:39:22 -04:00
|
|
|
|
(const :tag "Highlight syntax" t)
|
|
|
|
|
(const :tag "Allow hunk-based fallback" hunk-also)))
|
2018-12-18 01:11:15 +02:00
|
|
|
|
|
2010-06-29 14:17:31 -04:00
|
|
|
|
(defvar diff-vc-backend nil
|
|
|
|
|
"The VC backend that created the current Diff buffer, if any.")
|
|
|
|
|
|
2018-11-14 02:14:52 +02:00
|
|
|
|
(defvar diff-vc-revisions nil
|
|
|
|
|
"The VC revisions compared in the current Diff buffer, if any.")
|
|
|
|
|
|
2019-04-09 11:09:11 -04:00
|
|
|
|
(defvar-local diff-default-directory nil
|
2018-12-18 01:11:15 +02:00
|
|
|
|
"The default directory where the current Diff buffer was created.")
|
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(defvar diff-outline-regexp
|
|
|
|
|
"\\([*+][*+][*+] [^0-9]\\|@@ ...\\|\\*\\*\\* [0-9].\\|--- [0-9]..\\)")
|
|
|
|
|
|
2000-11-12 16:59:52 +00:00
|
|
|
|
;;;;
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;;;; keymap, menu, ...
|
2000-11-12 16:59:52 +00:00
|
|
|
|
;;;;
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2000-03-21 16:59:17 +00:00
|
|
|
|
(easy-mmode-defmap diff-mode-shared-map
|
2012-04-26 11:43:32 +08:00
|
|
|
|
'(("n" . diff-hunk-next)
|
2000-03-21 16:59:17 +00:00
|
|
|
|
("N" . diff-file-next)
|
|
|
|
|
("p" . diff-hunk-prev)
|
|
|
|
|
("P" . diff-file-prev)
|
2007-09-22 23:27:53 +00:00
|
|
|
|
("\t" . diff-hunk-next)
|
|
|
|
|
([backtab] . diff-hunk-prev)
|
2000-03-21 16:59:17 +00:00
|
|
|
|
("k" . diff-hunk-kill)
|
|
|
|
|
("K" . diff-file-kill)
|
2012-04-26 11:43:32 +08:00
|
|
|
|
("}" . diff-file-next) ; From compilation-minor-mode.
|
2000-03-21 16:59:17 +00:00
|
|
|
|
("{" . diff-file-prev)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
("\C-m" . diff-goto-source)
|
2004-04-14 17:31:42 +00:00
|
|
|
|
([mouse-2] . diff-goto-source)
|
2011-03-18 15:52:05 -04:00
|
|
|
|
("W" . widen)
|
2012-04-26 11:43:32 +08:00
|
|
|
|
("o" . diff-goto-source) ; other-window
|
2011-03-18 15:52:05 -04:00
|
|
|
|
("A" . diff-ediff-patch)
|
|
|
|
|
("r" . diff-restrict-view)
|
2012-04-26 11:43:32 +08:00
|
|
|
|
("R" . diff-reverse-direction)
|
|
|
|
|
([remap undo] . diff-undo))
|
2011-02-01 16:22:21 -05:00
|
|
|
|
"Basic keymap for `diff-mode', bound to various prefix keys."
|
|
|
|
|
:inherit special-mode-map)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2000-03-21 16:59:17 +00:00
|
|
|
|
(easy-mmode-defmap diff-mode-map
|
2011-03-18 15:52:05 -04:00
|
|
|
|
`(("\e" . ,(let ((map (make-sparse-keymap)))
|
|
|
|
|
;; We want to inherit most bindings from diff-mode-shared-map,
|
|
|
|
|
;; but not all since they may hide useful M-<foo> global
|
|
|
|
|
;; bindings when editing.
|
|
|
|
|
(set-keymap-parent map diff-mode-shared-map)
|
2011-11-28 20:03:11 +02:00
|
|
|
|
(dolist (key '("A" "r" "R" "g" "q" "W" "z"))
|
2011-03-18 15:52:05 -04:00
|
|
|
|
(define-key map key nil))
|
|
|
|
|
map))
|
2000-08-16 19:56:10 +00:00
|
|
|
|
;; From compilation-minor-mode.
|
|
|
|
|
("\C-c\C-c" . diff-goto-source)
|
2008-02-05 02:14:10 +00:00
|
|
|
|
;; By analogy with the global C-x 4 a binding.
|
|
|
|
|
("\C-x4A" . diff-add-change-log-entries-other-window)
|
2000-08-16 19:56:10 +00:00
|
|
|
|
;; Misc operations.
|
2000-09-29 02:25:32 +00:00
|
|
|
|
("\C-c\C-a" . diff-apply-hunk)
|
2006-05-02 01:39:40 +00:00
|
|
|
|
("\C-c\C-e" . diff-ediff-patch)
|
|
|
|
|
("\C-c\C-n" . diff-restrict-view)
|
|
|
|
|
("\C-c\C-s" . diff-split-hunk)
|
2004-09-04 12:46:17 +00:00
|
|
|
|
("\C-c\C-t" . diff-test-hunk)
|
2007-10-20 02:02:22 +00:00
|
|
|
|
("\C-c\C-r" . diff-reverse-direction)
|
2006-05-02 01:39:40 +00:00
|
|
|
|
("\C-c\C-u" . diff-context->unified)
|
2006-11-27 20:59:54 +00:00
|
|
|
|
;; `d' because it duplicates the context :-( --Stef
|
|
|
|
|
("\C-c\C-d" . diff-unified->context)
|
2007-10-20 02:02:22 +00:00
|
|
|
|
("\C-c\C-w" . diff-ignore-whitespace-hunk)
|
2020-10-30 14:04:06 +01:00
|
|
|
|
;; `l' because it "refreshes" the hunk like C-l refreshes the screen
|
|
|
|
|
("\C-c\C-l" . diff-refresh-hunk)
|
2007-10-20 02:02:22 +00:00
|
|
|
|
("\C-c\C-b" . diff-refine-hunk) ;No reason for `b' :-(
|
2004-09-08 20:20:05 +00:00
|
|
|
|
("\C-c\C-f" . next-error-follow-minor-mode))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
"Keymap for `diff-mode'. See also `diff-mode-shared-map'.")
|
|
|
|
|
|
|
|
|
|
(easy-menu-define diff-mode-menu diff-mode-map
|
|
|
|
|
"Menu for `diff-mode'."
|
|
|
|
|
'("Diff"
|
2008-03-09 15:39:48 +00:00
|
|
|
|
["Jump to Source" diff-goto-source
|
|
|
|
|
:help "Jump to the corresponding source line"]
|
|
|
|
|
["Apply hunk" diff-apply-hunk
|
|
|
|
|
:help "Apply the current hunk to the source file and go to the next"]
|
|
|
|
|
["Test applying hunk" diff-test-hunk
|
|
|
|
|
:help "See whether it's possible to apply the current hunk"]
|
|
|
|
|
["Apply diff with Ediff" diff-ediff-patch
|
|
|
|
|
:help "Call `ediff-patch-file' on the current buffer"]
|
2008-02-05 02:14:10 +00:00
|
|
|
|
["Create Change Log entries" diff-add-change-log-entries-other-window
|
2008-02-04 21:41:09 +00:00
|
|
|
|
:help "Create ChangeLog entries for the changes in the diff buffer"]
|
2007-07-22 21:59:55 +00:00
|
|
|
|
"-----"
|
2008-03-09 15:39:48 +00:00
|
|
|
|
["Reverse direction" diff-reverse-direction
|
|
|
|
|
:help "Reverse the direction of the diffs"]
|
|
|
|
|
["Context -> Unified" diff-context->unified
|
|
|
|
|
:help "Convert context diffs to unified diffs"]
|
|
|
|
|
["Unified -> Context" diff-unified->context
|
|
|
|
|
:help "Convert unified diffs to context diffs"]
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;;["Fixup Headers" diff-fixup-modifs (not buffer-read-only)]
|
2012-11-09 01:31:53 +08:00
|
|
|
|
["Remove trailing whitespace" diff-delete-trailing-whitespace
|
2012-09-10 10:40:13 -04:00
|
|
|
|
:help "Remove trailing whitespace problems introduced by the diff"]
|
2009-01-10 17:21:04 +00:00
|
|
|
|
["Show trailing whitespace" whitespace-mode
|
2009-01-13 14:55:57 +00:00
|
|
|
|
:style toggle :selected (bound-and-true-p whitespace-mode)
|
2009-01-10 17:21:04 +00:00
|
|
|
|
:help "Show trailing whitespace in modified lines"]
|
2007-07-22 21:59:55 +00:00
|
|
|
|
"-----"
|
2008-03-09 15:39:48 +00:00
|
|
|
|
["Split hunk" diff-split-hunk
|
|
|
|
|
:active (diff-splittable-p)
|
|
|
|
|
:help "Split the current (unified diff) hunk at point into two hunks"]
|
|
|
|
|
["Ignore whitespace changes" diff-ignore-whitespace-hunk
|
|
|
|
|
:help "Re-diff the current hunk, ignoring whitespace differences"]
|
2020-10-30 14:04:06 +01:00
|
|
|
|
["Recompute the hunk" diff-refresh-hunk
|
|
|
|
|
:help "Re-diff the current hunk, keeping the whitespace differences"]
|
2008-03-09 15:39:48 +00:00
|
|
|
|
["Highlight fine changes" diff-refine-hunk
|
|
|
|
|
:help "Highlight changes of hunk at point at a finer granularity"]
|
|
|
|
|
["Kill current hunk" diff-hunk-kill
|
|
|
|
|
:help "Kill current hunk"]
|
|
|
|
|
["Kill current file's hunks" diff-file-kill
|
|
|
|
|
:help "Kill all current file's hunks"]
|
2007-07-22 21:59:55 +00:00
|
|
|
|
"-----"
|
2008-03-09 15:39:48 +00:00
|
|
|
|
["Previous Hunk" diff-hunk-prev
|
|
|
|
|
:help "Go to the previous count'th hunk"]
|
|
|
|
|
["Next Hunk" diff-hunk-next
|
|
|
|
|
:help "Go to the next count'th hunk"]
|
|
|
|
|
["Previous File" diff-file-prev
|
|
|
|
|
:help "Go to the previous count'th file"]
|
|
|
|
|
["Next File" diff-file-next
|
|
|
|
|
:help "Go to the next count'th file"]
|
1999-10-09 23:52:39 +00:00
|
|
|
|
))
|
|
|
|
|
|
2000-09-29 02:25:32 +00:00
|
|
|
|
(defcustom diff-minor-mode-prefix "\C-c="
|
1999-12-07 07:04:03 +00:00
|
|
|
|
"Prefix key for `diff-minor-mode' commands."
|
2018-07-10 22:52:21 -04:00
|
|
|
|
:type '(choice (string "\e") (string "C-c=") string))
|
1999-12-07 07:04:03 +00:00
|
|
|
|
|
2000-03-21 16:59:17 +00:00
|
|
|
|
(easy-mmode-defmap diff-minor-mode-map
|
|
|
|
|
`((,diff-minor-mode-prefix . ,diff-mode-shared-map))
|
1999-12-07 07:04:03 +00:00
|
|
|
|
"Keymap for `diff-minor-mode'. See also `diff-mode-shared-map'.")
|
|
|
|
|
|
2008-07-21 14:20:24 +00:00
|
|
|
|
(define-minor-mode diff-auto-refine-mode
|
2018-12-19 01:10:09 +02:00
|
|
|
|
"Toggle automatic diff hunk finer highlighting (Diff Auto Refine mode).
|
2011-10-19 20:26:14 -04:00
|
|
|
|
|
|
|
|
|
Diff Auto Refine mode is a buffer-local minor mode used with
|
|
|
|
|
`diff-mode'. When enabled, Emacs automatically highlights
|
|
|
|
|
changes in detail as the user visits hunks. When transitioning
|
|
|
|
|
from disabled to enabled, it tries to refine the current hunk, as
|
|
|
|
|
well."
|
2019-02-24 16:13:13 +01:00
|
|
|
|
:group 'diff-mode :init-value nil :lighter nil ;; " Auto-Refine"
|
|
|
|
|
(if diff-auto-refine-mode
|
|
|
|
|
(progn
|
|
|
|
|
(customize-set-variable 'diff-refine 'navigation)
|
|
|
|
|
(condition-case-unless-debug nil (diff-refine-hunk) (error nil)))
|
|
|
|
|
(customize-set-variable 'diff-refine nil)))
|
|
|
|
|
(make-obsolete 'diff-auto-refine-mode "set `diff-refine' instead." "27.1")
|
|
|
|
|
(make-obsolete-variable 'diff-auto-refine-mode
|
|
|
|
|
"set `diff-refine' instead." "27.1")
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2000-11-12 16:59:52 +00:00
|
|
|
|
;;;;
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;;;; font-lock support
|
2000-11-12 16:59:52 +00:00
|
|
|
|
;;;;
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2019-05-15 21:00:49 +02:00
|
|
|
|
;; Note: The colors used in a color-rich environments (a GUI or in a
|
|
|
|
|
;; terminal supporting 24 bit colors) doesn't render well in terminal
|
|
|
|
|
;; supporting only 256 colors. Concretely, both #ffeeee
|
|
|
|
|
;; (diff-removed) and #eeffee (diff-added) are mapped to the same
|
|
|
|
|
;; greyish color. "min-colors 257" ensures that those colors are not
|
|
|
|
|
;; used terminals supporting only 256 colors. However, any number
|
|
|
|
|
;; between 257 and 2^24 (16777216) would do.
|
|
|
|
|
|
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Remove "-face" suffix from diff-mode faces
2005-06-10 Miles Bader <miles@gnu.org>
* lisp/diff-mode.el (diff-header, diff-file-header, diff-index)
(diff-hunk-header, diff-removed, diff-added, diff-changed)
(diff-function, diff-context, diff-nonexistent): Remove "-face"
suffix from face names.
(diff-header-face, diff-file-header-face, diff-index-face)
(diff-hunk-header-face, diff-removed-face, diff-added-face)
(diff-changed-face, diff-function-face, diff-context-face)
(diff-nonexistent-face): New backward-compatibility aliases for
renamed faces.
(diff-header-face, diff-file-header-face)
(diff-index, diff-index-face, diff-hunk-header)
(diff-hunk-header-face, diff-removed, diff-removed-face)
(diff-added, diff-added-face, diff-changed-face, diff-function)
(diff-function-face, diff-context-face, diff-nonexistent)
(diff-nonexistent-face): Use renamed diff-mode faces.
2005-06-10 07:43:31 +00:00
|
|
|
|
(defface diff-header
|
2004-05-02 19:27:59 +00:00
|
|
|
|
'((((class color) (min-colors 88) (background light))
|
Add ':extend t' face attribute to diff faces (bug#37774)
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Add ':extend t' face attribute.
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C, ediff-even-diff-Ancestor)
(ediff-odd-diff-A, ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor): Add ':extend t' face attribute.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base, smerge-markers): Add ':extend t' face attribute.
* lisp/vc/log-view.el (log-view-file, log-view-message):
Add ':extend t' face attribute.
* lisp/faces.el (secondary-selection): Add ':extend t' face attribute.
(line-number-major-tick, line-number-minor-tick):
Change :foreground to :background.
2019-10-19 23:51:03 +03:00
|
|
|
|
:background "grey85" :extend t)
|
2004-05-02 19:27:59 +00:00
|
|
|
|
(((class color) (min-colors 88) (background dark))
|
Add ':extend t' face attribute to diff faces (bug#37774)
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Add ':extend t' face attribute.
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C, ediff-even-diff-Ancestor)
(ediff-odd-diff-A, ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor): Add ':extend t' face attribute.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base, smerge-markers): Add ':extend t' face attribute.
* lisp/vc/log-view.el (log-view-file, log-view-message):
Add ':extend t' face attribute.
* lisp/faces.el (secondary-selection): Add ':extend t' face attribute.
(line-number-major-tick, line-number-minor-tick):
Change :foreground to :background.
2019-10-19 23:51:03 +03:00
|
|
|
|
:background "grey45" :extend t)
|
2012-05-25 03:55:40 +03:00
|
|
|
|
(((class color))
|
Add ':extend' attribute to faces and themes
* etc/themes/wombat-theme.el:
* etc/themes/wheatgrass-theme.el:
* etc/themes/tsdh-light-theme.el:
* etc/themes/tsdh-dark-theme.el:
* etc/themes/tango-theme.el:
* etc/themes/tango-dark-theme.el:
* etc/themes/misterioso-theme.el:
* etc/themes/manoj-dark-theme.el:
* etc/themes/light-blue-theme.el:
* etc/themes/leuven-theme.el:
* etc/themes/dichromacy-theme.el:
* etc/themes/deeper-blue-theme.el:
* etc/themes/adwaita-theme.el: Add ':extend' attribute to all
faces that are by default defined with it.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base):
* lisp/vc/log-view.el (log-view-file, log-view-message):
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C)
(ediff-even-diff-Ancestor, ediff-odd-diff-A)
(ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor):
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Make sure all definitions of faces
have the same value of the ':extend' property, otherwise
customizing background color or underline etc. attributes of
these faces on some displays will produce effects different
from other displays.
2019-11-30 13:27:11 +02:00
|
|
|
|
:foreground "blue1" :weight bold :extend t)
|
|
|
|
|
(t :weight bold :extend t))
|
2018-07-10 22:52:21 -04:00
|
|
|
|
"`diff-mode' face inherited by hunk and index header faces.")
|
2000-09-19 16:24:30 +00:00
|
|
|
|
|
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Remove "-face" suffix from diff-mode faces
2005-06-10 Miles Bader <miles@gnu.org>
* lisp/diff-mode.el (diff-header, diff-file-header, diff-index)
(diff-hunk-header, diff-removed, diff-added, diff-changed)
(diff-function, diff-context, diff-nonexistent): Remove "-face"
suffix from face names.
(diff-header-face, diff-file-header-face, diff-index-face)
(diff-hunk-header-face, diff-removed-face, diff-added-face)
(diff-changed-face, diff-function-face, diff-context-face)
(diff-nonexistent-face): New backward-compatibility aliases for
renamed faces.
(diff-header-face, diff-file-header-face)
(diff-index, diff-index-face, diff-hunk-header)
(diff-hunk-header-face, diff-removed, diff-removed-face)
(diff-added, diff-added-face, diff-changed-face, diff-function)
(diff-function-face, diff-context-face, diff-nonexistent)
(diff-nonexistent-face): Use renamed diff-mode faces.
2005-06-10 07:43:31 +00:00
|
|
|
|
(defface diff-file-header
|
2004-05-02 19:27:59 +00:00
|
|
|
|
'((((class color) (min-colors 88) (background light))
|
Add ':extend t' face attribute to diff faces (bug#37774)
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Add ':extend t' face attribute.
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C, ediff-even-diff-Ancestor)
(ediff-odd-diff-A, ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor): Add ':extend t' face attribute.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base, smerge-markers): Add ':extend t' face attribute.
* lisp/vc/log-view.el (log-view-file, log-view-message):
Add ':extend t' face attribute.
* lisp/faces.el (secondary-selection): Add ':extend t' face attribute.
(line-number-major-tick, line-number-minor-tick):
Change :foreground to :background.
2019-10-19 23:51:03 +03:00
|
|
|
|
:background "grey75" :weight bold :extend t)
|
2004-05-02 19:27:59 +00:00
|
|
|
|
(((class color) (min-colors 88) (background dark))
|
Add ':extend t' face attribute to diff faces (bug#37774)
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Add ':extend t' face attribute.
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C, ediff-even-diff-Ancestor)
(ediff-odd-diff-A, ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor): Add ':extend t' face attribute.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base, smerge-markers): Add ':extend t' face attribute.
* lisp/vc/log-view.el (log-view-file, log-view-message):
Add ':extend t' face attribute.
* lisp/faces.el (secondary-selection): Add ':extend t' face attribute.
(line-number-major-tick, line-number-minor-tick):
Change :foreground to :background.
2019-10-19 23:51:03 +03:00
|
|
|
|
:background "grey60" :weight bold :extend t)
|
2012-05-25 03:55:40 +03:00
|
|
|
|
(((class color))
|
Add ':extend' attribute to faces and themes
* etc/themes/wombat-theme.el:
* etc/themes/wheatgrass-theme.el:
* etc/themes/tsdh-light-theme.el:
* etc/themes/tsdh-dark-theme.el:
* etc/themes/tango-theme.el:
* etc/themes/tango-dark-theme.el:
* etc/themes/misterioso-theme.el:
* etc/themes/manoj-dark-theme.el:
* etc/themes/light-blue-theme.el:
* etc/themes/leuven-theme.el:
* etc/themes/dichromacy-theme.el:
* etc/themes/deeper-blue-theme.el:
* etc/themes/adwaita-theme.el: Add ':extend' attribute to all
faces that are by default defined with it.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base):
* lisp/vc/log-view.el (log-view-file, log-view-message):
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C)
(ediff-even-diff-Ancestor, ediff-odd-diff-A)
(ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor):
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Make sure all definitions of faces
have the same value of the ':extend' property, otherwise
customizing background color or underline etc. attributes of
these faces on some displays will produce effects different
from other displays.
2019-11-30 13:27:11 +02:00
|
|
|
|
:foreground "cyan" :weight bold :extend t)
|
|
|
|
|
(t :weight bold :extend t)) ; :height 1.3
|
2018-07-10 22:52:21 -04:00
|
|
|
|
"`diff-mode' face used to highlight file header lines.")
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Remove "-face" suffix from diff-mode faces
2005-06-10 Miles Bader <miles@gnu.org>
* lisp/diff-mode.el (diff-header, diff-file-header, diff-index)
(diff-hunk-header, diff-removed, diff-added, diff-changed)
(diff-function, diff-context, diff-nonexistent): Remove "-face"
suffix from face names.
(diff-header-face, diff-file-header-face, diff-index-face)
(diff-hunk-header-face, diff-removed-face, diff-added-face)
(diff-changed-face, diff-function-face, diff-context-face)
(diff-nonexistent-face): New backward-compatibility aliases for
renamed faces.
(diff-header-face, diff-file-header-face)
(diff-index, diff-index-face, diff-hunk-header)
(diff-hunk-header-face, diff-removed, diff-removed-face)
(diff-added, diff-added-face, diff-changed-face, diff-function)
(diff-function-face, diff-context-face, diff-nonexistent)
(diff-nonexistent-face): Use renamed diff-mode faces.
2005-06-10 07:43:31 +00:00
|
|
|
|
(defface diff-index
|
|
|
|
|
'((t :inherit diff-file-header))
|
2018-07-10 22:52:21 -04:00
|
|
|
|
"`diff-mode' face used to highlight index header lines.")
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Remove "-face" suffix from diff-mode faces
2005-06-10 Miles Bader <miles@gnu.org>
* lisp/diff-mode.el (diff-header, diff-file-header, diff-index)
(diff-hunk-header, diff-removed, diff-added, diff-changed)
(diff-function, diff-context, diff-nonexistent): Remove "-face"
suffix from face names.
(diff-header-face, diff-file-header-face, diff-index-face)
(diff-hunk-header-face, diff-removed-face, diff-added-face)
(diff-changed-face, diff-function-face, diff-context-face)
(diff-nonexistent-face): New backward-compatibility aliases for
renamed faces.
(diff-header-face, diff-file-header-face)
(diff-index, diff-index-face, diff-hunk-header)
(diff-hunk-header-face, diff-removed, diff-removed-face)
(diff-added, diff-added-face, diff-changed-face, diff-function)
(diff-function-face, diff-context-face, diff-nonexistent)
(diff-nonexistent-face): Use renamed diff-mode faces.
2005-06-10 07:43:31 +00:00
|
|
|
|
(defface diff-hunk-header
|
|
|
|
|
'((t :inherit diff-header))
|
2018-07-10 22:52:21 -04:00
|
|
|
|
"`diff-mode' face used to highlight hunk header lines.")
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Remove "-face" suffix from diff-mode faces
2005-06-10 Miles Bader <miles@gnu.org>
* lisp/diff-mode.el (diff-header, diff-file-header, diff-index)
(diff-hunk-header, diff-removed, diff-added, diff-changed)
(diff-function, diff-context, diff-nonexistent): Remove "-face"
suffix from face names.
(diff-header-face, diff-file-header-face, diff-index-face)
(diff-hunk-header-face, diff-removed-face, diff-added-face)
(diff-changed-face, diff-function-face, diff-context-face)
(diff-nonexistent-face): New backward-compatibility aliases for
renamed faces.
(diff-header-face, diff-file-header-face)
(diff-index, diff-index-face, diff-hunk-header)
(diff-hunk-header-face, diff-removed, diff-removed-face)
(diff-added, diff-added-face, diff-changed-face, diff-function)
(diff-function-face, diff-context-face, diff-nonexistent)
(diff-nonexistent-face): Use renamed diff-mode faces.
2005-06-10 07:43:31 +00:00
|
|
|
|
(defface diff-removed
|
2012-05-25 03:55:40 +03:00
|
|
|
|
'((default
|
|
|
|
|
:inherit diff-changed)
|
2019-05-15 21:00:49 +02:00
|
|
|
|
(((class color) (min-colors 257) (background light))
|
Add ':extend t' face attribute to diff faces (bug#37774)
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Add ':extend t' face attribute.
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C, ediff-even-diff-Ancestor)
(ediff-odd-diff-A, ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor): Add ':extend t' face attribute.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base, smerge-markers): Add ':extend t' face attribute.
* lisp/vc/log-view.el (log-view-file, log-view-message):
Add ':extend t' face attribute.
* lisp/faces.el (secondary-selection): Add ':extend t' face attribute.
(line-number-major-tick, line-number-minor-tick):
Change :foreground to :background.
2019-10-19 23:51:03 +03:00
|
|
|
|
:background "#ffeeee" :extend t)
|
2019-05-15 21:00:49 +02:00
|
|
|
|
(((class color) (min-colors 88) (background light))
|
Add ':extend t' face attribute to diff faces (bug#37774)
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Add ':extend t' face attribute.
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C, ediff-even-diff-Ancestor)
(ediff-odd-diff-A, ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor): Add ':extend t' face attribute.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base, smerge-markers): Add ':extend t' face attribute.
* lisp/vc/log-view.el (log-view-file, log-view-message):
Add ':extend t' face attribute.
* lisp/faces.el (secondary-selection): Add ':extend t' face attribute.
(line-number-major-tick, line-number-minor-tick):
Change :foreground to :background.
2019-10-19 23:51:03 +03:00
|
|
|
|
:background "#ffdddd" :extend t)
|
2012-05-25 03:55:40 +03:00
|
|
|
|
(((class color) (min-colors 88) (background dark))
|
Add ':extend t' face attribute to diff faces (bug#37774)
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Add ':extend t' face attribute.
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C, ediff-even-diff-Ancestor)
(ediff-odd-diff-A, ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor): Add ':extend t' face attribute.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base, smerge-markers): Add ':extend t' face attribute.
* lisp/vc/log-view.el (log-view-file, log-view-message):
Add ':extend t' face attribute.
* lisp/faces.el (secondary-selection): Add ':extend t' face attribute.
(line-number-major-tick, line-number-minor-tick):
Change :foreground to :background.
2019-10-19 23:51:03 +03:00
|
|
|
|
:background "#553333" :extend t)
|
2012-05-25 03:55:40 +03:00
|
|
|
|
(((class color))
|
Add ':extend' attribute to faces and themes
* etc/themes/wombat-theme.el:
* etc/themes/wheatgrass-theme.el:
* etc/themes/tsdh-light-theme.el:
* etc/themes/tsdh-dark-theme.el:
* etc/themes/tango-theme.el:
* etc/themes/tango-dark-theme.el:
* etc/themes/misterioso-theme.el:
* etc/themes/manoj-dark-theme.el:
* etc/themes/light-blue-theme.el:
* etc/themes/leuven-theme.el:
* etc/themes/dichromacy-theme.el:
* etc/themes/deeper-blue-theme.el:
* etc/themes/adwaita-theme.el: Add ':extend' attribute to all
faces that are by default defined with it.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base):
* lisp/vc/log-view.el (log-view-file, log-view-message):
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C)
(ediff-even-diff-Ancestor, ediff-odd-diff-A)
(ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor):
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Make sure all definitions of faces
have the same value of the ':extend' property, otherwise
customizing background color or underline etc. attributes of
these faces on some displays will produce effects different
from other displays.
2019-11-30 13:27:11 +02:00
|
|
|
|
:foreground "red" :extend t))
|
2018-07-10 22:52:21 -04:00
|
|
|
|
"`diff-mode' face used to highlight removed lines.")
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Remove "-face" suffix from diff-mode faces
2005-06-10 Miles Bader <miles@gnu.org>
* lisp/diff-mode.el (diff-header, diff-file-header, diff-index)
(diff-hunk-header, diff-removed, diff-added, diff-changed)
(diff-function, diff-context, diff-nonexistent): Remove "-face"
suffix from face names.
(diff-header-face, diff-file-header-face, diff-index-face)
(diff-hunk-header-face, diff-removed-face, diff-added-face)
(diff-changed-face, diff-function-face, diff-context-face)
(diff-nonexistent-face): New backward-compatibility aliases for
renamed faces.
(diff-header-face, diff-file-header-face)
(diff-index, diff-index-face, diff-hunk-header)
(diff-hunk-header-face, diff-removed, diff-removed-face)
(diff-added, diff-added-face, diff-changed-face, diff-function)
(diff-function-face, diff-context-face, diff-nonexistent)
(diff-nonexistent-face): Use renamed diff-mode faces.
2005-06-10 07:43:31 +00:00
|
|
|
|
(defface diff-added
|
2012-05-25 03:55:40 +03:00
|
|
|
|
'((default
|
|
|
|
|
:inherit diff-changed)
|
2019-05-15 21:00:49 +02:00
|
|
|
|
(((class color) (min-colors 257) (background light))
|
Add ':extend t' face attribute to diff faces (bug#37774)
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Add ':extend t' face attribute.
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C, ediff-even-diff-Ancestor)
(ediff-odd-diff-A, ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor): Add ':extend t' face attribute.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base, smerge-markers): Add ':extend t' face attribute.
* lisp/vc/log-view.el (log-view-file, log-view-message):
Add ':extend t' face attribute.
* lisp/faces.el (secondary-selection): Add ':extend t' face attribute.
(line-number-major-tick, line-number-minor-tick):
Change :foreground to :background.
2019-10-19 23:51:03 +03:00
|
|
|
|
:background "#eeffee" :extend t)
|
2019-05-15 21:00:49 +02:00
|
|
|
|
(((class color) (min-colors 88) (background light))
|
Add ':extend t' face attribute to diff faces (bug#37774)
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Add ':extend t' face attribute.
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C, ediff-even-diff-Ancestor)
(ediff-odd-diff-A, ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor): Add ':extend t' face attribute.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base, smerge-markers): Add ':extend t' face attribute.
* lisp/vc/log-view.el (log-view-file, log-view-message):
Add ':extend t' face attribute.
* lisp/faces.el (secondary-selection): Add ':extend t' face attribute.
(line-number-major-tick, line-number-minor-tick):
Change :foreground to :background.
2019-10-19 23:51:03 +03:00
|
|
|
|
:background "#ddffdd" :extend t)
|
2012-05-25 03:55:40 +03:00
|
|
|
|
(((class color) (min-colors 88) (background dark))
|
Add ':extend t' face attribute to diff faces (bug#37774)
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Add ':extend t' face attribute.
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C, ediff-even-diff-Ancestor)
(ediff-odd-diff-A, ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor): Add ':extend t' face attribute.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base, smerge-markers): Add ':extend t' face attribute.
* lisp/vc/log-view.el (log-view-file, log-view-message):
Add ':extend t' face attribute.
* lisp/faces.el (secondary-selection): Add ':extend t' face attribute.
(line-number-major-tick, line-number-minor-tick):
Change :foreground to :background.
2019-10-19 23:51:03 +03:00
|
|
|
|
:background "#335533" :extend t)
|
2012-05-25 03:55:40 +03:00
|
|
|
|
(((class color))
|
Add ':extend' attribute to faces and themes
* etc/themes/wombat-theme.el:
* etc/themes/wheatgrass-theme.el:
* etc/themes/tsdh-light-theme.el:
* etc/themes/tsdh-dark-theme.el:
* etc/themes/tango-theme.el:
* etc/themes/tango-dark-theme.el:
* etc/themes/misterioso-theme.el:
* etc/themes/manoj-dark-theme.el:
* etc/themes/light-blue-theme.el:
* etc/themes/leuven-theme.el:
* etc/themes/dichromacy-theme.el:
* etc/themes/deeper-blue-theme.el:
* etc/themes/adwaita-theme.el: Add ':extend' attribute to all
faces that are by default defined with it.
* lisp/vc/smerge-mode.el (smerge-upper, smerge-lower)
(smerge-base):
* lisp/vc/log-view.el (log-view-file, log-view-message):
* lisp/vc/ediff-init.el (ediff-current-diff-A)
(ediff-current-diff-B, ediff-current-diff-C)
(ediff-current-diff-Ancestor, ediff-even-diff-A)
(ediff-even-diff-B, ediff-even-diff-C)
(ediff-even-diff-Ancestor, ediff-odd-diff-A)
(ediff-odd-diff-B, ediff-odd-diff-C)
(ediff-odd-diff-Ancestor):
* lisp/vc/diff-mode.el (diff-header, diff-file-header)
(diff-removed, diff-added): Make sure all definitions of faces
have the same value of the ':extend' property, otherwise
customizing background color or underline etc. attributes of
these faces on some displays will produce effects different
from other displays.
2019-11-30 13:27:11 +02:00
|
|
|
|
:foreground "green" :extend t))
|
2018-07-10 22:52:21 -04:00
|
|
|
|
"`diff-mode' face used to highlight added lines.")
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Remove "-face" suffix from diff-mode faces
2005-06-10 Miles Bader <miles@gnu.org>
* lisp/diff-mode.el (diff-header, diff-file-header, diff-index)
(diff-hunk-header, diff-removed, diff-added, diff-changed)
(diff-function, diff-context, diff-nonexistent): Remove "-face"
suffix from face names.
(diff-header-face, diff-file-header-face, diff-index-face)
(diff-hunk-header-face, diff-removed-face, diff-added-face)
(diff-changed-face, diff-function-face, diff-context-face)
(diff-nonexistent-face): New backward-compatibility aliases for
renamed faces.
(diff-header-face, diff-file-header-face)
(diff-index, diff-index-face, diff-hunk-header)
(diff-hunk-header-face, diff-removed, diff-removed-face)
(diff-added, diff-added-face, diff-changed-face, diff-function)
(diff-function-face, diff-context-face, diff-nonexistent)
(diff-nonexistent-face): Use renamed diff-mode faces.
2005-06-10 07:43:31 +00:00
|
|
|
|
(defface diff-changed
|
2014-06-18 11:48:49 +03:00
|
|
|
|
'((t nil))
|
2005-05-20 13:35:11 +00:00
|
|
|
|
"`diff-mode' face used to highlight changed lines."
|
2018-07-10 22:52:21 -04:00
|
|
|
|
:version "25.1")
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2005-07-19 11:28:35 +00:00
|
|
|
|
(defface diff-indicator-removed
|
2018-12-18 01:11:15 +02:00
|
|
|
|
'((default :inherit diff-removed)
|
|
|
|
|
(((class color) (min-colors 88))
|
|
|
|
|
:foreground "#aa2222"))
|
2005-07-19 11:28:35 +00:00
|
|
|
|
"`diff-mode' face used to highlight indicator of removed lines (-, <)."
|
|
|
|
|
:version "22.1")
|
|
|
|
|
(defvar diff-indicator-removed-face 'diff-indicator-removed)
|
|
|
|
|
|
|
|
|
|
(defface diff-indicator-added
|
2018-12-18 01:11:15 +02:00
|
|
|
|
'((default :inherit diff-added)
|
|
|
|
|
(((class color) (min-colors 88))
|
|
|
|
|
:foreground "#22aa22"))
|
2005-07-19 11:28:35 +00:00
|
|
|
|
"`diff-mode' face used to highlight indicator of added lines (+, >)."
|
|
|
|
|
:version "22.1")
|
|
|
|
|
(defvar diff-indicator-added-face 'diff-indicator-added)
|
|
|
|
|
|
|
|
|
|
(defface diff-indicator-changed
|
2018-12-18 01:11:15 +02:00
|
|
|
|
'((default :inherit diff-changed)
|
|
|
|
|
(((class color) (min-colors 88))
|
|
|
|
|
:foreground "#aaaa22"))
|
2005-07-19 11:28:35 +00:00
|
|
|
|
"`diff-mode' face used to highlight indicator of changed lines."
|
|
|
|
|
:version "22.1")
|
|
|
|
|
(defvar diff-indicator-changed-face 'diff-indicator-changed)
|
|
|
|
|
|
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Remove "-face" suffix from diff-mode faces
2005-06-10 Miles Bader <miles@gnu.org>
* lisp/diff-mode.el (diff-header, diff-file-header, diff-index)
(diff-hunk-header, diff-removed, diff-added, diff-changed)
(diff-function, diff-context, diff-nonexistent): Remove "-face"
suffix from face names.
(diff-header-face, diff-file-header-face, diff-index-face)
(diff-hunk-header-face, diff-removed-face, diff-added-face)
(diff-changed-face, diff-function-face, diff-context-face)
(diff-nonexistent-face): New backward-compatibility aliases for
renamed faces.
(diff-header-face, diff-file-header-face)
(diff-index, diff-index-face, diff-hunk-header)
(diff-hunk-header-face, diff-removed, diff-removed-face)
(diff-added, diff-added-face, diff-changed-face, diff-function)
(diff-function-face, diff-context-face, diff-nonexistent)
(diff-nonexistent-face): Use renamed diff-mode faces.
2005-06-10 07:43:31 +00:00
|
|
|
|
(defface diff-function
|
2006-03-21 10:15:39 +00:00
|
|
|
|
'((t :inherit diff-header))
|
2018-07-10 22:52:21 -04:00
|
|
|
|
"`diff-mode' face used to highlight function names produced by \"diff -p\".")
|
2000-10-18 08:52:23 +00:00
|
|
|
|
|
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Remove "-face" suffix from diff-mode faces
2005-06-10 Miles Bader <miles@gnu.org>
* lisp/diff-mode.el (diff-header, diff-file-header, diff-index)
(diff-hunk-header, diff-removed, diff-added, diff-changed)
(diff-function, diff-context, diff-nonexistent): Remove "-face"
suffix from face names.
(diff-header-face, diff-file-header-face, diff-index-face)
(diff-hunk-header-face, diff-removed-face, diff-added-face)
(diff-changed-face, diff-function-face, diff-context-face)
(diff-nonexistent-face): New backward-compatibility aliases for
renamed faces.
(diff-header-face, diff-file-header-face)
(diff-index, diff-index-face, diff-hunk-header)
(diff-hunk-header-face, diff-removed, diff-removed-face)
(diff-added, diff-added-face, diff-changed-face, diff-function)
(diff-function-face, diff-context-face, diff-nonexistent)
(diff-nonexistent-face): Use renamed diff-mode faces.
2005-06-10 07:43:31 +00:00
|
|
|
|
(defface diff-context
|
2019-12-02 01:33:41 +02:00
|
|
|
|
'((t :extend t))
|
2005-05-20 13:35:11 +00:00
|
|
|
|
"`diff-mode' face used to highlight context and other side-information."
|
2019-12-02 01:33:41 +02:00
|
|
|
|
:version "27.1")
|
2000-09-19 16:24:30 +00:00
|
|
|
|
|
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-368
Remove "-face" suffix from diff-mode faces
2005-06-10 Miles Bader <miles@gnu.org>
* lisp/diff-mode.el (diff-header, diff-file-header, diff-index)
(diff-hunk-header, diff-removed, diff-added, diff-changed)
(diff-function, diff-context, diff-nonexistent): Remove "-face"
suffix from face names.
(diff-header-face, diff-file-header-face, diff-index-face)
(diff-hunk-header-face, diff-removed-face, diff-added-face)
(diff-changed-face, diff-function-face, diff-context-face)
(diff-nonexistent-face): New backward-compatibility aliases for
renamed faces.
(diff-header-face, diff-file-header-face)
(diff-index, diff-index-face, diff-hunk-header)
(diff-hunk-header-face, diff-removed, diff-removed-face)
(diff-added, diff-added-face, diff-changed-face, diff-function)
(diff-function-face, diff-context-face, diff-nonexistent)
(diff-nonexistent-face): Use renamed diff-mode faces.
2005-06-10 07:43:31 +00:00
|
|
|
|
(defface diff-nonexistent
|
|
|
|
|
'((t :inherit diff-file-header))
|
2018-07-10 22:52:21 -04:00
|
|
|
|
"`diff-mode' face used to highlight nonexistent files in recursive diffs.")
|
2001-05-01 13:33:59 +00:00
|
|
|
|
|
2020-08-21 15:58:32 +02:00
|
|
|
|
(defface diff-error
|
|
|
|
|
'((((class color))
|
|
|
|
|
:foreground "red" :background "black" :weight bold)
|
|
|
|
|
(t :weight bold))
|
2020-11-18 23:14:39 +02:00
|
|
|
|
"`diff-mode' face for error messages from diff."
|
|
|
|
|
:version "28.1")
|
2020-08-21 15:58:32 +02:00
|
|
|
|
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(defconst diff-yank-handler '(diff-yank-function))
|
|
|
|
|
(defun diff-yank-function (text)
|
2004-03-24 21:35:40 +00:00
|
|
|
|
;; FIXME: the yank-handler is now called separately on each piece of text
|
|
|
|
|
;; with a yank-handler property, so the next-single-property-change call
|
|
|
|
|
;; below will always return nil :-( --stef
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(let ((mixed (next-single-property-change 0 'yank-handler text))
|
|
|
|
|
(start (point)))
|
|
|
|
|
;; First insert the text.
|
|
|
|
|
(insert text)
|
|
|
|
|
;; If the text does not include any diff markers and if we're not
|
|
|
|
|
;; yanking back into a diff-mode buffer, get rid of the prefixes.
|
|
|
|
|
(unless (or mixed (derived-mode-p 'diff-mode))
|
|
|
|
|
(undo-boundary) ; Just in case the user wanted the prefixes.
|
|
|
|
|
(let ((re (save-excursion
|
|
|
|
|
(if (re-search-backward "^[><!][ \t]" start t)
|
|
|
|
|
(if (eq (char-after) ?!)
|
|
|
|
|
"^[!+- ][ \t]" "^[<>][ \t]")
|
|
|
|
|
"^[ <>!+-]"))))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(while (re-search-backward re start t)
|
|
|
|
|
(replace-match "" t t)))))))
|
2005-04-04 08:54:58 +00:00
|
|
|
|
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(defconst diff-hunk-header-re-unified
|
2008-04-25 02:08:43 +00:00
|
|
|
|
"^@@ -\\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)? \\+\\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)? @@")
|
2008-05-26 17:25:44 +00:00
|
|
|
|
(defconst diff-context-mid-hunk-header-re
|
|
|
|
|
"--- \\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)? ----$")
|
2004-03-23 20:50:36 +00:00
|
|
|
|
|
Remove some face aliases obsoleted in 22.1
* lisp/faces.el (modeline-inactive, modeline-highlight, modeline-buffer-id):
* lisp/hilit-chg.el (highlight-changes-face, highlight-changes-delete-face):
* lisp/info.el (Info-title-1-face, Info-title-2-face, Info-title-3-face,
Info-title-4-face, info-menu-5):
* lisp/obsolete/old-whitespace.el (whitespace-highlight-face):
* lisp/paren.el (show-paren-match-face, show-paren-mismatch-face):
* lisp/progmodes/make-mode.el (makefile-space-face):
* lisp/textmodes/texinfo.el (texinfo-heading-face): Remove.
(texinfo-font-lock-keywords): Use texinfo-heading face.
* lisp/vc/add-log.el (change-log-date-face, change-log-name-face,
change-log-email-face, change-log-file-face, change-log-list-face,
change-log-conditionals-face, change-log-function-face,
change-log-acknowledgement-face):
* lisp/vc/diff-mode.el (diff-header-face, diff-file-header-face,
diff-index-face, diff-hunk-header-face, diff-removed-face, diff-added-face,
diff-changed-face, diff-function-face, diff-context-face,
diff-nonexistent-face): Remove.
(diff-use-changed-face, diff-font-lock-keywords): Use non-obsolete face
symbols.
(diff-hunk-file-names): Fix comment.
(diff-refine-change): Remove.
(diff-refine-removed, diff-refine-added, diff-refine-hunk): Use
non-obsolete face.
* lisp/vc/log-view.el (log-view-file-face, log-view-message-face): Remove.
(log-view-font-lock-keywords): Use non-obsolete face names.
* lisp/vc/pcvs-info.el (cvs-header-face, cvs-filename-face, cvs-unknown-face,
cvs-handled-face, cvs-need-action-face, cvs-marked-face, cvs-msg-face):
* lisp/wid-edit.el (widget-documentation-face, widget-button-face,
widget-field-face, widget-single-line-field-face, widget-inactive-face,
widget-button-pressed-face):
* lisp/woman.el (woman-italic-face, woman-bold-face, woman-unknown-face,
woman-addition-face): Remove.
2016-06-23 17:13:11 -04:00
|
|
|
|
(defvar diff-use-changed-face (and (face-differs-from-default-p 'diff-changed)
|
|
|
|
|
(not (face-equal 'diff-changed 'diff-added))
|
|
|
|
|
(not (face-equal 'diff-changed 'diff-removed)))
|
2012-05-25 03:55:40 +03:00
|
|
|
|
"If non-nil, use the face `diff-changed' for changed lines in context diffs.
|
|
|
|
|
Otherwise, use the face `diff-removed' for removed lines,
|
|
|
|
|
and the face `diff-added' for added lines.")
|
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(defvar diff-font-lock-keywords
|
2008-02-25 03:54:54 +00:00
|
|
|
|
`((,(concat "\\(" diff-hunk-header-re-unified "\\)\\(.*\\)$")
|
2016-06-27 16:50:03 -04:00
|
|
|
|
(1 'diff-hunk-header) (6 'diff-function))
|
2005-07-19 11:28:35 +00:00
|
|
|
|
("^\\(\\*\\{15\\}\\)\\(.*\\)$" ;context
|
2016-06-27 16:50:03 -04:00
|
|
|
|
(1 'diff-hunk-header) (2 'diff-function))
|
|
|
|
|
("^\\*\\*\\* .+ \\*\\*\\*\\*". 'diff-hunk-header) ;context
|
|
|
|
|
(,diff-context-mid-hunk-header-re . 'diff-hunk-header) ;context
|
|
|
|
|
("^[0-9,]+[acd][0-9,]+$" . 'diff-hunk-header) ;normal
|
|
|
|
|
("^---$" . 'diff-hunk-header) ;normal
|
2007-08-03 22:06:36 +00:00
|
|
|
|
;; For file headers, accept files with spaces, but be careful to rule
|
|
|
|
|
;; out false-positives when matching hunk headers.
|
|
|
|
|
("^\\(---\\|\\+\\+\\+\\|\\*\\*\\*\\) \\([^\t\n]+?\\)\\(?:\t.*\\| \\(\\*\\*\\*\\*\\|----\\)\\)?\n"
|
2016-06-27 16:50:03 -04:00
|
|
|
|
(0 'diff-header)
|
|
|
|
|
(2 (if (not (match-end 3)) 'diff-file-header) prepend))
|
2005-07-19 11:28:35 +00:00
|
|
|
|
("^\\([-<]\\)\\(.*\n\\)"
|
2016-06-27 16:50:03 -04:00
|
|
|
|
(1 diff-indicator-removed-face) (2 'diff-removed))
|
2005-07-19 11:28:35 +00:00
|
|
|
|
("^\\([+>]\\)\\(.*\n\\)"
|
2016-06-27 16:50:03 -04:00
|
|
|
|
(1 diff-indicator-added-face) (2 'diff-added))
|
2005-07-19 11:28:35 +00:00
|
|
|
|
("^\\(!\\)\\(.*\n\\)"
|
2012-05-25 03:55:40 +03:00
|
|
|
|
(1 (if diff-use-changed-face
|
|
|
|
|
diff-indicator-changed-face
|
|
|
|
|
;; Otherwise, search for `diff-context-mid-hunk-header-re' and
|
Remove some face aliases obsoleted in 22.1
* lisp/faces.el (modeline-inactive, modeline-highlight, modeline-buffer-id):
* lisp/hilit-chg.el (highlight-changes-face, highlight-changes-delete-face):
* lisp/info.el (Info-title-1-face, Info-title-2-face, Info-title-3-face,
Info-title-4-face, info-menu-5):
* lisp/obsolete/old-whitespace.el (whitespace-highlight-face):
* lisp/paren.el (show-paren-match-face, show-paren-mismatch-face):
* lisp/progmodes/make-mode.el (makefile-space-face):
* lisp/textmodes/texinfo.el (texinfo-heading-face): Remove.
(texinfo-font-lock-keywords): Use texinfo-heading face.
* lisp/vc/add-log.el (change-log-date-face, change-log-name-face,
change-log-email-face, change-log-file-face, change-log-list-face,
change-log-conditionals-face, change-log-function-face,
change-log-acknowledgement-face):
* lisp/vc/diff-mode.el (diff-header-face, diff-file-header-face,
diff-index-face, diff-hunk-header-face, diff-removed-face, diff-added-face,
diff-changed-face, diff-function-face, diff-context-face,
diff-nonexistent-face): Remove.
(diff-use-changed-face, diff-font-lock-keywords): Use non-obsolete face
symbols.
(diff-hunk-file-names): Fix comment.
(diff-refine-change): Remove.
(diff-refine-removed, diff-refine-added, diff-refine-hunk): Use
non-obsolete face.
* lisp/vc/log-view.el (log-view-file-face, log-view-message-face): Remove.
(log-view-font-lock-keywords): Use non-obsolete face names.
* lisp/vc/pcvs-info.el (cvs-header-face, cvs-filename-face, cvs-unknown-face,
cvs-handled-face, cvs-need-action-face, cvs-marked-face, cvs-msg-face):
* lisp/wid-edit.el (widget-documentation-face, widget-button-face,
widget-field-face, widget-single-line-field-face, widget-inactive-face,
widget-button-pressed-face):
* lisp/woman.el (woman-italic-face, woman-bold-face, woman-unknown-face,
woman-addition-face): Remove.
2016-06-23 17:13:11 -04:00
|
|
|
|
;; if the line of context diff is above, use `diff-removed';
|
|
|
|
|
;; if below, use `diff-added'.
|
2012-05-25 03:55:40 +03:00
|
|
|
|
(save-match-data
|
|
|
|
|
(let ((limit (save-excursion (diff-beginning-of-hunk))))
|
|
|
|
|
(if (save-excursion (re-search-backward diff-context-mid-hunk-header-re limit t))
|
|
|
|
|
diff-indicator-added-face
|
|
|
|
|
diff-indicator-removed-face)))))
|
|
|
|
|
(2 (if diff-use-changed-face
|
2016-06-27 16:50:03 -04:00
|
|
|
|
'diff-changed
|
2012-05-25 03:55:40 +03:00
|
|
|
|
;; Otherwise, use the same method as above.
|
|
|
|
|
(save-match-data
|
|
|
|
|
(let ((limit (save-excursion (diff-beginning-of-hunk))))
|
|
|
|
|
(if (save-excursion (re-search-backward diff-context-mid-hunk-header-re limit t))
|
2016-06-27 16:50:03 -04:00
|
|
|
|
'diff-added
|
|
|
|
|
'diff-removed))))))
|
2012-05-25 03:55:40 +03:00
|
|
|
|
("^\\(?:Index\\|revno\\): \\(.+\\).*\n"
|
2016-06-27 16:50:03 -04:00
|
|
|
|
(0 'diff-header) (1 'diff-index prepend))
|
2018-12-19 01:10:09 +02:00
|
|
|
|
("^\\(?:index .*\\.\\.\\|diff \\).*\n" . 'diff-header)
|
2019-02-25 23:27:47 +02:00
|
|
|
|
("^\\(?:new\\|deleted\\) file mode .*\n" . 'diff-header)
|
2016-06-27 16:50:03 -04:00
|
|
|
|
("^Only in .*\n" . 'diff-nonexistent)
|
2018-12-19 01:10:09 +02:00
|
|
|
|
("^Binary files .* differ\n" . 'diff-file-header)
|
2005-07-19 11:28:35 +00:00
|
|
|
|
("^\\(#\\)\\(.*\\)"
|
2005-07-19 14:42:40 +00:00
|
|
|
|
(1 font-lock-comment-delimiter-face)
|
|
|
|
|
(2 font-lock-comment-face))
|
2020-08-21 15:58:32 +02:00
|
|
|
|
("^diff: .*" (0 'diff-error))
|
2018-07-10 22:52:21 -04:00
|
|
|
|
("^[^-=+*!<>#].*\n" (0 'diff-context))
|
2018-12-18 01:11:15 +02:00
|
|
|
|
(,#'diff--font-lock-syntax)
|
2018-07-13 12:34:50 -04:00
|
|
|
|
(,#'diff--font-lock-prettify)
|
2018-07-10 22:52:21 -04:00
|
|
|
|
(,#'diff--font-lock-refined)))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
(defconst diff-font-lock-defaults
|
2000-05-10 22:12:46 +00:00
|
|
|
|
'(diff-font-lock-keywords t nil nil nil (font-lock-multiline . nil)))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2000-08-29 14:38:49 +00:00
|
|
|
|
(defvar diff-imenu-generic-expression
|
|
|
|
|
;; Prefer second name as first is most likely to be a backup or
|
2000-11-14 18:09:21 +00:00
|
|
|
|
;; version-control name. The [\t\n] at the end of the unidiff pattern
|
|
|
|
|
;; catches Debian source diff files (which lack the trailing date).
|
2020-04-16 11:04:24 +02:00
|
|
|
|
'((nil "\\+\\+\\+ \\([^\t\n]+\\)[\t\n]" 1) ; unidiffs
|
2000-08-29 14:38:49 +00:00
|
|
|
|
(nil "^--- \\([^\t\n]+\\)\t.*\n\\*" 1))) ; context diffs
|
|
|
|
|
|
2000-11-12 16:59:52 +00:00
|
|
|
|
;;;;
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;;;; Movement
|
2000-11-12 16:59:52 +00:00
|
|
|
|
;;;;
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(defvar diff-valid-unified-empty-line t
|
|
|
|
|
"If non-nil, empty lines are valid in unified diffs.
|
|
|
|
|
Some versions of diff replace all-blank context lines in unified format with
|
|
|
|
|
empty lines. This makes the format less robust, but is tolerated.
|
2017-11-25 22:45:41 -08:00
|
|
|
|
See https://lists.gnu.org/r/emacs-devel/2007-11/msg01990.html")
|
2008-02-25 03:54:54 +00:00
|
|
|
|
|
|
|
|
|
(defconst diff-hunk-header-re
|
|
|
|
|
(concat "^\\(?:" diff-hunk-header-re-unified ".*\\|\\*\\{15\\}.*\n\\*\\*\\* .+ \\*\\*\\*\\*\\|[0-9]+\\(,[0-9]+\\)?[acd][0-9]+\\(,[0-9]+\\)?\\)$"))
|
2008-05-11 21:57:27 +00:00
|
|
|
|
(defconst diff-file-header-re (concat "^\\(--- .+\n\\+\\+\\+ \\|\\*\\*\\* .+\n--- \\|[^-+!<>0-9@* \n]\\).+\n" (substring diff-hunk-header-re 1)))
|
2017-01-30 21:43:32 -08:00
|
|
|
|
|
|
|
|
|
(defconst diff-separator-re "^--+ ?$")
|
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(defvar diff-narrowed-to nil)
|
2019-10-13 05:52:21 +02:00
|
|
|
|
(defvar diff-buffer-type nil)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(defun diff-hunk-style (&optional style)
|
2004-04-16 21:52:14 +00:00
|
|
|
|
(when (looking-at diff-hunk-header-re)
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(setq style (cdr (assq (char-after) '((?@ . unified) (?* . context)))))
|
2004-04-16 21:52:14 +00:00
|
|
|
|
(goto-char (match-end 0)))
|
2007-10-09 04:12:24 +00:00
|
|
|
|
style)
|
|
|
|
|
|
2019-10-13 05:52:21 +02:00
|
|
|
|
(defun diff-prev-line-if-patch-separator ()
|
|
|
|
|
"Return previous line if it has patch separator as produced by git."
|
|
|
|
|
(pcase diff-buffer-type
|
|
|
|
|
('git
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((old-point (point)))
|
|
|
|
|
(forward-line -1)
|
|
|
|
|
(if (looking-at "^-- $")
|
|
|
|
|
(point)
|
|
|
|
|
old-point))))
|
|
|
|
|
(_ (point))))
|
|
|
|
|
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(defun diff-end-of-hunk (&optional style donttrustheader)
|
2012-04-26 16:00:47 +08:00
|
|
|
|
"Advance to the end of the current hunk, and return its position."
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(let (end)
|
|
|
|
|
(when (looking-at diff-hunk-header-re)
|
|
|
|
|
;; Especially important for unified (because headers are ambiguous).
|
|
|
|
|
(setq style (diff-hunk-style style))
|
|
|
|
|
(goto-char (match-end 0))
|
|
|
|
|
(when (and (not donttrustheader) (match-end 2))
|
2008-04-25 02:08:43 +00:00
|
|
|
|
(let* ((nold (string-to-number (or (match-string 2) "1")))
|
|
|
|
|
(nnew (string-to-number (or (match-string 4) "1")))
|
2008-03-18 20:49:52 +00:00
|
|
|
|
(endold
|
2012-10-26 11:51:42 -04:00
|
|
|
|
(save-excursion
|
|
|
|
|
(re-search-forward (if diff-valid-unified-empty-line
|
|
|
|
|
"^[- \n]" "^[- ]")
|
2008-03-18 20:49:52 +00:00
|
|
|
|
nil t nold)
|
2012-10-26 11:51:42 -04:00
|
|
|
|
(line-beginning-position
|
|
|
|
|
;; Skip potential "\ No newline at end of file".
|
|
|
|
|
(if (looking-at ".*\n\\\\") 3 2))))
|
2008-03-18 20:49:52 +00:00
|
|
|
|
(endnew
|
|
|
|
|
;; The hunk may end with a bunch of "+" lines, so the `end' is
|
|
|
|
|
;; then further than computed above.
|
|
|
|
|
(save-excursion
|
|
|
|
|
(re-search-forward (if diff-valid-unified-empty-line
|
|
|
|
|
"^[+ \n]" "^[+ ]")
|
|
|
|
|
nil t nnew)
|
2012-10-26 11:51:42 -04:00
|
|
|
|
(line-beginning-position
|
|
|
|
|
;; Skip potential "\ No newline at end of file".
|
|
|
|
|
(if (looking-at ".*\n\\\\") 3 2)))))
|
2008-03-18 20:49:52 +00:00
|
|
|
|
(setq end (max endold endnew)))))
|
2008-02-25 03:54:54 +00:00
|
|
|
|
;; We may have a first evaluation of `end' thanks to the hunk header.
|
|
|
|
|
(unless end
|
|
|
|
|
(setq end (and (re-search-forward
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(pcase style
|
2018-11-05 01:22:15 +01:00
|
|
|
|
('unified
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(concat (if diff-valid-unified-empty-line
|
|
|
|
|
"^[^-+# \\\n]\\|" "^[^-+# \\]\\|")
|
|
|
|
|
;; A `unified' header is ambiguous.
|
|
|
|
|
diff-file-header-re))
|
2019-03-25 13:20:17 -04:00
|
|
|
|
('context (if diff-valid-unified-empty-line
|
|
|
|
|
"^[^-+#! \n\\]" "^[^-+#! \\]"))
|
2018-11-05 01:22:15 +01:00
|
|
|
|
('normal "^[^<>#\\]")
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(_ "^[^-+#!<> \\]"))
|
2008-02-25 03:54:54 +00:00
|
|
|
|
nil t)
|
|
|
|
|
(match-beginning 0)))
|
|
|
|
|
(when diff-valid-unified-empty-line
|
|
|
|
|
;; While empty lines may be valid inside hunks, they are also likely
|
|
|
|
|
;; to be unrelated to the hunk.
|
|
|
|
|
(goto-char (or end (point-max)))
|
|
|
|
|
(while (eq ?\n (char-before (1- (point))))
|
|
|
|
|
(forward-char -1)
|
2019-10-13 05:52:21 +02:00
|
|
|
|
(setq end (point))))
|
|
|
|
|
(setq end (diff-prev-line-if-patch-separator)))
|
2000-05-10 22:12:46 +00:00
|
|
|
|
;; The return value is used by easy-mmode-define-navigation.
|
|
|
|
|
(goto-char (or end (point-max)))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2017-01-21 11:54:55 +09:00
|
|
|
|
;; "index ", "old mode", "new mode", "new file mode" and
|
|
|
|
|
;; "deleted file mode" are output by git-diff.
|
|
|
|
|
(defconst diff-file-junk-re
|
2017-03-21 17:25:55 +09:00
|
|
|
|
(concat "Index: \\|Prereq: \\|=\\{20,\\}\\|" ; SVN
|
2017-01-29 18:49:10 +09:00
|
|
|
|
"diff \\|index \\|\\(?:deleted file\\|new\\(?: file\\)?\\|old\\) mode\\|=== modified file"))
|
2017-01-21 11:54:55 +09:00
|
|
|
|
|
|
|
|
|
;; If point is in a diff header, then return beginning
|
|
|
|
|
;; of hunk position otherwise return nil.
|
|
|
|
|
(defun diff--at-diff-header-p ()
|
|
|
|
|
"Return non-nil if point is inside a diff header."
|
|
|
|
|
(let ((regexp-hunk diff-hunk-header-re)
|
|
|
|
|
(regexp-file diff-file-header-re)
|
|
|
|
|
(regexp-junk diff-file-junk-re)
|
|
|
|
|
(orig (point)))
|
|
|
|
|
(catch 'headerp
|
|
|
|
|
(save-excursion
|
|
|
|
|
(forward-line 0)
|
|
|
|
|
(when (looking-at regexp-hunk) ; Hunk header.
|
|
|
|
|
(throw 'headerp (point)))
|
|
|
|
|
(forward-line -1)
|
|
|
|
|
(when (re-search-forward regexp-file (point-at-eol 4) t) ; File header.
|
|
|
|
|
(forward-line 0)
|
|
|
|
|
(throw 'headerp (point)))
|
|
|
|
|
(goto-char orig)
|
|
|
|
|
(forward-line 0)
|
|
|
|
|
(when (looking-at regexp-junk) ; Git diff junk.
|
|
|
|
|
(while (and (looking-at regexp-junk)
|
|
|
|
|
(not (bobp)))
|
|
|
|
|
(forward-line -1))
|
|
|
|
|
(re-search-forward regexp-file nil t)
|
|
|
|
|
(forward-line 0)
|
|
|
|
|
(throw 'headerp (point)))) nil)))
|
|
|
|
|
|
2007-07-22 21:26:34 +00:00
|
|
|
|
(defun diff-beginning-of-hunk (&optional try-harder)
|
2012-04-26 16:00:47 +08:00
|
|
|
|
"Move back to the previous hunk beginning, and return its position.
|
|
|
|
|
If point is in a file header rather than a hunk, advance to the
|
|
|
|
|
next hunk if TRY-HARDER is non-nil; otherwise signal an error."
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(beginning-of-line)
|
2017-01-21 11:54:55 +09:00
|
|
|
|
(if (looking-at diff-hunk-header-re) ; At hunk header.
|
2012-04-26 16:00:47 +08:00
|
|
|
|
(point)
|
2017-01-21 11:54:55 +09:00
|
|
|
|
(let ((pos (diff--at-diff-header-p))
|
|
|
|
|
(regexp diff-hunk-header-re))
|
|
|
|
|
(cond (pos ; At junk diff header.
|
|
|
|
|
(if try-harder
|
|
|
|
|
(goto-char pos)
|
|
|
|
|
(error "Can't find the beginning of the hunk")))
|
|
|
|
|
((re-search-backward regexp nil t)) ; In the middle of a hunk.
|
|
|
|
|
((re-search-forward regexp nil t) ; At first hunk header.
|
2017-01-29 18:49:10 +09:00
|
|
|
|
(forward-line 0)
|
|
|
|
|
(point))
|
2017-01-21 11:54:55 +09:00
|
|
|
|
(t (error "Can't find the beginning of the hunk"))))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2007-07-22 22:02:49 +00:00
|
|
|
|
(defun diff-unified-hunk-p ()
|
|
|
|
|
(save-excursion
|
|
|
|
|
(ignore-errors
|
|
|
|
|
(diff-beginning-of-hunk)
|
|
|
|
|
(looking-at "^@@"))))
|
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(defun diff-beginning-of-file ()
|
|
|
|
|
(beginning-of-line)
|
|
|
|
|
(unless (looking-at diff-file-header-re)
|
2007-08-03 22:06:36 +00:00
|
|
|
|
(let ((start (point))
|
|
|
|
|
res)
|
|
|
|
|
;; diff-file-header-re may need to match up to 4 lines, so in case
|
|
|
|
|
;; we're inside the header, we need to move up to 3 lines forward.
|
|
|
|
|
(forward-line 3)
|
|
|
|
|
(if (and (setq res (re-search-backward diff-file-header-re nil t))
|
|
|
|
|
;; Maybe the 3 lines forward were too much and we matched
|
|
|
|
|
;; a file header after our starting point :-(
|
|
|
|
|
(or (<= (point) start)
|
|
|
|
|
(setq res (re-search-backward diff-file-header-re nil t))))
|
|
|
|
|
res
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(error "Can't find the beginning of the file")))))
|
2008-12-03 05:48:14 +00:00
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
(defun diff-end-of-file ()
|
2000-05-10 22:12:46 +00:00
|
|
|
|
(re-search-forward "^[-+#!<>0-9@* \\]" nil t)
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(re-search-forward (concat "^[^-+#!<>0-9@* \\]\\|" diff-file-header-re)
|
|
|
|
|
nil 'move)
|
|
|
|
|
(if (match-beginning 1)
|
|
|
|
|
(goto-char (match-beginning 1))
|
|
|
|
|
(beginning-of-line)))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2012-10-01 23:49:28 -04:00
|
|
|
|
(defvar diff--auto-refine-data nil)
|
|
|
|
|
|
2000-03-21 16:59:17 +00:00
|
|
|
|
;; Define diff-{hunk,file}-{prev,next}
|
|
|
|
|
(easy-mmode-define-navigation
|
2017-01-21 11:54:38 +09:00
|
|
|
|
diff-hunk diff-hunk-header-re "hunk" diff-end-of-hunk diff-restrict-view
|
2019-02-24 16:13:13 +01:00
|
|
|
|
(when (and (eq diff-refine 'navigation) (called-interactively-p 'interactive))
|
2017-01-21 11:54:38 +09:00
|
|
|
|
(unless (prog1 diff--auto-refine-data
|
|
|
|
|
(setq diff--auto-refine-data
|
|
|
|
|
(cons (current-buffer) (point-marker))))
|
|
|
|
|
(run-at-time 0.0 nil
|
|
|
|
|
(lambda ()
|
|
|
|
|
(when diff--auto-refine-data
|
|
|
|
|
(let ((buffer (car diff--auto-refine-data))
|
|
|
|
|
(point (cdr diff--auto-refine-data)))
|
|
|
|
|
(setq diff--auto-refine-data nil)
|
|
|
|
|
(with-local-quit
|
|
|
|
|
(when (buffer-live-p buffer)
|
|
|
|
|
(with-current-buffer buffer
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char point)
|
|
|
|
|
(diff-refine-hunk))))))))))))
|
2007-10-20 02:02:22 +00:00
|
|
|
|
|
2000-03-21 16:59:17 +00:00
|
|
|
|
(easy-mmode-define-navigation
|
2017-01-21 11:54:38 +09:00
|
|
|
|
diff-file diff-file-header-re "file" diff-end-of-file)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2012-04-26 16:00:47 +08:00
|
|
|
|
(defun diff-bounds-of-hunk ()
|
|
|
|
|
"Return the bounds of the diff hunk at point.
|
|
|
|
|
The return value is a list (BEG END), which are the hunk's start
|
|
|
|
|
and end positions. Signal an error if no hunk is found. If
|
|
|
|
|
point is in a file header, return the bounds of the next hunk."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((pos (point))
|
|
|
|
|
(beg (diff-beginning-of-hunk t))
|
|
|
|
|
(end (diff-end-of-hunk)))
|
2017-01-21 11:54:38 +09:00
|
|
|
|
(cond ((>= end pos)
|
2012-04-26 16:00:47 +08:00
|
|
|
|
(list beg end))
|
|
|
|
|
;; If this hunk ends above POS, consider the next hunk.
|
|
|
|
|
((re-search-forward diff-hunk-header-re nil t)
|
|
|
|
|
(list (match-beginning 0) (diff-end-of-hunk)))
|
2017-01-21 11:54:38 +09:00
|
|
|
|
(t (error "No hunk found"))))))
|
2012-04-26 16:00:47 +08:00
|
|
|
|
|
|
|
|
|
(defun diff-bounds-of-file ()
|
|
|
|
|
"Return the bounds of the file segment at point.
|
|
|
|
|
The return value is a list (BEG END), which are the segment's
|
|
|
|
|
start and end positions."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((pos (point))
|
|
|
|
|
(beg (progn (diff-beginning-of-file-and-junk)
|
|
|
|
|
(point))))
|
|
|
|
|
(diff-end-of-file)
|
|
|
|
|
;; bzr puts a newline after the last hunk.
|
|
|
|
|
(while (looking-at "^\n")
|
|
|
|
|
(forward-char 1))
|
|
|
|
|
(if (> pos (point))
|
|
|
|
|
(error "Not inside a file diff"))
|
|
|
|
|
(list beg (point)))))
|
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(defun diff-restrict-view (&optional arg)
|
|
|
|
|
"Restrict the view to the current hunk.
|
|
|
|
|
If the prefix ARG is given, restrict the view to the current file instead."
|
|
|
|
|
(interactive "P")
|
2021-02-26 16:51:15 -05:00
|
|
|
|
(apply #'narrow-to-region
|
2012-04-26 16:00:47 +08:00
|
|
|
|
(if arg (diff-bounds-of-file) (diff-bounds-of-hunk)))
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
(setq-local diff-narrowed-to (if arg 'file 'hunk)))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2017-02-02 22:27:33 +09:00
|
|
|
|
(defun diff--some-hunks-p ()
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(re-search-forward diff-hunk-header-re nil t)))
|
|
|
|
|
|
2000-03-21 16:59:17 +00:00
|
|
|
|
(defun diff-hunk-kill ()
|
2012-04-26 16:00:47 +08:00
|
|
|
|
"Kill the hunk at point."
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(interactive)
|
2017-02-02 22:27:33 +09:00
|
|
|
|
(if (not (diff--some-hunks-p))
|
|
|
|
|
(error "No hunks")
|
|
|
|
|
(diff-beginning-of-hunk t)
|
|
|
|
|
(let* ((hunk-bounds (diff-bounds-of-hunk))
|
|
|
|
|
(file-bounds (ignore-errors (diff-bounds-of-file)))
|
|
|
|
|
;; If the current hunk is the only one for its file, kill the
|
|
|
|
|
;; file header too.
|
|
|
|
|
(bounds (if (and file-bounds
|
|
|
|
|
(progn (goto-char (car file-bounds))
|
|
|
|
|
(= (progn (diff-hunk-next) (point))
|
|
|
|
|
(car hunk-bounds)))
|
|
|
|
|
(progn (goto-char (cadr hunk-bounds))
|
|
|
|
|
;; bzr puts a newline after the last hunk.
|
|
|
|
|
(while (looking-at "^\n")
|
|
|
|
|
(forward-char 1))
|
|
|
|
|
(= (point) (cadr file-bounds))))
|
|
|
|
|
file-bounds
|
|
|
|
|
hunk-bounds))
|
|
|
|
|
(inhibit-read-only t))
|
2021-02-26 16:51:15 -05:00
|
|
|
|
(apply #'kill-region bounds)
|
2017-02-02 22:27:33 +09:00
|
|
|
|
(goto-char (car bounds))
|
|
|
|
|
(ignore-errors (diff-beginning-of-hunk t)))))
|
2008-02-25 03:54:54 +00:00
|
|
|
|
|
2007-07-22 21:26:34 +00:00
|
|
|
|
(defun diff-beginning-of-file-and-junk ()
|
|
|
|
|
"Go to the beginning of file-related diff-info.
|
|
|
|
|
This is like `diff-beginning-of-file' except it tries to skip back over leading
|
|
|
|
|
data such as \"Index: ...\" and such."
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(let* ((orig (point))
|
|
|
|
|
;; Skip forward over what might be "leading junk" so as to get
|
|
|
|
|
;; closer to the actual diff.
|
|
|
|
|
(_ (progn (beginning-of-line)
|
|
|
|
|
(while (looking-at diff-file-junk-re)
|
|
|
|
|
(forward-line 1))))
|
|
|
|
|
(start (point))
|
2007-08-03 22:06:36 +00:00
|
|
|
|
(prevfile (condition-case err
|
|
|
|
|
(save-excursion (diff-beginning-of-file) (point))
|
|
|
|
|
(error err)))
|
|
|
|
|
(err (if (consp prevfile) prevfile))
|
|
|
|
|
(nextfile (ignore-errors
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char start) (diff-file-next) (point))))
|
|
|
|
|
;; prevhunk is one of the limits.
|
|
|
|
|
(prevhunk (save-excursion
|
|
|
|
|
(ignore-errors
|
|
|
|
|
(if (numberp prevfile) (goto-char prevfile))
|
|
|
|
|
(diff-hunk-prev) (point))))
|
|
|
|
|
(previndex (save-excursion
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(forward-line 1) ;In case we're looking at "Index:".
|
2007-08-03 22:06:36 +00:00
|
|
|
|
(re-search-backward "^Index: " prevhunk t))))
|
|
|
|
|
;; If we're in the junk, we should use nextfile instead of prevfile.
|
|
|
|
|
(if (and (numberp nextfile)
|
|
|
|
|
(or (not (numberp prevfile))
|
|
|
|
|
(and previndex (> previndex prevfile))))
|
|
|
|
|
(setq prevfile nextfile))
|
|
|
|
|
(if (and previndex (numberp prevfile) (< previndex prevfile))
|
|
|
|
|
(setq prevfile previndex))
|
2017-01-21 11:54:38 +09:00
|
|
|
|
(if (and (numberp prevfile) (<= prevfile start))
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(progn
|
|
|
|
|
(goto-char prevfile)
|
|
|
|
|
;; Now skip backward over the leading junk we may have before the
|
|
|
|
|
;; diff itself.
|
|
|
|
|
(while (save-excursion
|
|
|
|
|
(and (zerop (forward-line -1))
|
|
|
|
|
(looking-at diff-file-junk-re)))
|
|
|
|
|
(forward-line -1)))
|
2007-08-03 22:06:36 +00:00
|
|
|
|
;; File starts *after* the starting point: we really weren't in
|
|
|
|
|
;; a file diff but elsewhere.
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(goto-char orig)
|
2007-08-03 22:06:36 +00:00
|
|
|
|
(signal (car err) (cdr err)))))
|
2008-12-03 05:48:14 +00:00
|
|
|
|
|
2000-03-21 16:59:17 +00:00
|
|
|
|
(defun diff-file-kill ()
|
1999-10-09 23:52:39 +00:00
|
|
|
|
"Kill current file's hunks."
|
|
|
|
|
(interactive)
|
2017-02-02 22:27:33 +09:00
|
|
|
|
(if (not (diff--some-hunks-p))
|
|
|
|
|
(error "No hunks")
|
|
|
|
|
(diff-beginning-of-hunk t)
|
|
|
|
|
(let ((inhibit-read-only t))
|
2021-02-26 16:51:15 -05:00
|
|
|
|
(apply #'kill-region (diff-bounds-of-file)))
|
2017-02-02 22:27:33 +09:00
|
|
|
|
(ignore-errors (diff-beginning-of-hunk t))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2000-02-07 02:01:07 +00:00
|
|
|
|
(defun diff-kill-junk ()
|
|
|
|
|
"Kill spurious empty diffs."
|
|
|
|
|
(interactive)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((inhibit-read-only t))
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(while (re-search-forward (concat "^\\(Index: .*\n\\)"
|
|
|
|
|
"\\([^-+!* <>].*\n\\)*?"
|
|
|
|
|
"\\(\\(Index:\\) \\|"
|
|
|
|
|
diff-file-header-re "\\)")
|
|
|
|
|
nil t)
|
|
|
|
|
(delete-region (if (match-end 4) (match-beginning 0) (match-end 1))
|
|
|
|
|
(match-beginning 3))
|
|
|
|
|
(beginning-of-line)))))
|
|
|
|
|
|
2000-11-12 16:59:52 +00:00
|
|
|
|
(defun diff-count-matches (re start end)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let ((n 0))
|
|
|
|
|
(goto-char start)
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(while (re-search-forward re end t) (cl-incf n))
|
2000-11-12 16:59:52 +00:00
|
|
|
|
n)))
|
|
|
|
|
|
2007-07-22 22:02:49 +00:00
|
|
|
|
(defun diff-splittable-p ()
|
|
|
|
|
(save-excursion
|
|
|
|
|
(beginning-of-line)
|
|
|
|
|
(and (looking-at "^[-+ ]")
|
|
|
|
|
(progn (forward-line -1) (looking-at "^[-+ ]"))
|
|
|
|
|
(diff-unified-hunk-p))))
|
|
|
|
|
|
2000-11-12 16:59:52 +00:00
|
|
|
|
(defun diff-split-hunk ()
|
|
|
|
|
"Split the current (unified diff) hunk at point into two hunks."
|
|
|
|
|
(interactive)
|
|
|
|
|
(beginning-of-line)
|
|
|
|
|
(let ((pos (point))
|
2012-04-26 16:00:47 +08:00
|
|
|
|
(start (diff-beginning-of-hunk)))
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(unless (looking-at diff-hunk-header-re-unified)
|
2000-11-12 16:59:52 +00:00
|
|
|
|
(error "diff-split-hunk only works on unified context diffs"))
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(let* ((start1 (string-to-number (match-string 1)))
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(start2 (string-to-number (match-string 3)))
|
2000-11-12 16:59:52 +00:00
|
|
|
|
(newstart1 (+ start1 (diff-count-matches "^[- \t]" (point) pos)))
|
2006-06-06 14:17:31 +00:00
|
|
|
|
(newstart2 (+ start2 (diff-count-matches "^[+ \t]" (point) pos)))
|
|
|
|
|
(inhibit-read-only t))
|
2000-11-12 16:59:52 +00:00
|
|
|
|
(goto-char pos)
|
|
|
|
|
;; Hopefully the after-change-function will not screw us over.
|
|
|
|
|
(insert "@@ -" (number-to-string newstart1) ",1 +"
|
|
|
|
|
(number-to-string newstart2) ",1 @@\n")
|
|
|
|
|
;; Fix the original hunk-header.
|
|
|
|
|
(diff-fixup-modifs start pos))))
|
2003-02-04 11:26:42 +00:00
|
|
|
|
|
2000-11-12 16:59:52 +00:00
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;;;;
|
|
|
|
|
;;;; jump to other buffers
|
|
|
|
|
;;;;
|
|
|
|
|
|
1999-12-07 07:04:03 +00:00
|
|
|
|
(defvar diff-remembered-files-alist nil)
|
2008-03-25 04:01:48 +00:00
|
|
|
|
(defvar diff-remembered-defdir nil)
|
1999-12-07 07:04:03 +00:00
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(defun diff-filename-drop-dir (file)
|
|
|
|
|
(when (string-match "/" file) (substring file (match-end 0))))
|
|
|
|
|
|
1999-12-07 07:04:03 +00:00
|
|
|
|
(defun diff-merge-strings (ancestor from to)
|
|
|
|
|
"Merge the diff between ANCESTOR and FROM into TO.
|
|
|
|
|
Returns the merged string if successful or nil otherwise.
|
2000-03-21 16:59:17 +00:00
|
|
|
|
The strings are assumed not to contain any \"\\n\" (i.e. end of line).
|
1999-12-07 07:04:03 +00:00
|
|
|
|
If ANCESTOR = FROM, returns TO.
|
|
|
|
|
If ANCESTOR = TO, returns FROM.
|
|
|
|
|
The heuristic is simplistic and only really works for cases
|
|
|
|
|
like \(diff-merge-strings \"b/foo\" \"b/bar\" \"/a/c/foo\")."
|
|
|
|
|
;; Ideally, we want:
|
|
|
|
|
;; AMB ANB CMD -> CND
|
|
|
|
|
;; but that's ambiguous if `foo' or `bar' is empty:
|
|
|
|
|
;; a/foo a/foo1 b/foo.c -> b/foo1.c but not 1b/foo.c or b/foo.c1
|
2000-03-21 16:59:17 +00:00
|
|
|
|
(let ((str (concat ancestor "\n" from "\n" to)))
|
1999-12-07 07:04:03 +00:00
|
|
|
|
(when (and (string-match (concat
|
2000-03-21 16:59:17 +00:00
|
|
|
|
"\\`\\(.*?\\)\\(.*\\)\\(.*\\)\n"
|
|
|
|
|
"\\1\\(.*\\)\\3\n"
|
1999-12-07 07:04:03 +00:00
|
|
|
|
"\\(.*\\(\\2\\).*\\)\\'") str)
|
|
|
|
|
(equal to (match-string 5 str)))
|
|
|
|
|
(concat (substring str (match-beginning 5) (match-beginning 6))
|
|
|
|
|
(match-string 4 str)
|
|
|
|
|
(substring str (match-end 6) (match-end 5))))))
|
|
|
|
|
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(defun diff-tell-file-name (old name)
|
|
|
|
|
"Tell Emacs where the find the source file of the current hunk.
|
|
|
|
|
If the OLD prefix arg is passed, tell the file NAME of the old file."
|
|
|
|
|
(interactive
|
|
|
|
|
(let* ((old current-prefix-arg)
|
2020-09-13 14:58:24 +02:00
|
|
|
|
(fs (diff-hunk-file-names current-prefix-arg)))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(unless fs (error "No file name to look for"))
|
2020-09-13 14:58:24 +02:00
|
|
|
|
(list old (read-file-name (format "File for %s: " (car fs))
|
|
|
|
|
nil (diff-find-file-name old 'noprompt) t))))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(let ((fs (diff-hunk-file-names old)))
|
|
|
|
|
(unless fs (error "No file name to look for"))
|
|
|
|
|
(push (cons fs name) diff-remembered-files-alist)))
|
2005-04-04 08:54:58 +00:00
|
|
|
|
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(defun diff-hunk-file-names (&optional old)
|
|
|
|
|
"Give the list of file names textually mentioned for the current hunk."
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(save-excursion
|
|
|
|
|
(unless (looking-at diff-file-header-re)
|
|
|
|
|
(or (ignore-errors (diff-beginning-of-file))
|
|
|
|
|
(re-search-forward diff-file-header-re nil t)))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(let ((limit (save-excursion
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(condition-case ()
|
2000-03-21 16:59:17 +00:00
|
|
|
|
(progn (diff-hunk-prev) (point))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(error (point-min)))))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(header-files
|
2020-09-12 19:44:06 -07:00
|
|
|
|
;; handle file names with spaces;
|
Remove some face aliases obsoleted in 22.1
* lisp/faces.el (modeline-inactive, modeline-highlight, modeline-buffer-id):
* lisp/hilit-chg.el (highlight-changes-face, highlight-changes-delete-face):
* lisp/info.el (Info-title-1-face, Info-title-2-face, Info-title-3-face,
Info-title-4-face, info-menu-5):
* lisp/obsolete/old-whitespace.el (whitespace-highlight-face):
* lisp/paren.el (show-paren-match-face, show-paren-mismatch-face):
* lisp/progmodes/make-mode.el (makefile-space-face):
* lisp/textmodes/texinfo.el (texinfo-heading-face): Remove.
(texinfo-font-lock-keywords): Use texinfo-heading face.
* lisp/vc/add-log.el (change-log-date-face, change-log-name-face,
change-log-email-face, change-log-file-face, change-log-list-face,
change-log-conditionals-face, change-log-function-face,
change-log-acknowledgement-face):
* lisp/vc/diff-mode.el (diff-header-face, diff-file-header-face,
diff-index-face, diff-hunk-header-face, diff-removed-face, diff-added-face,
diff-changed-face, diff-function-face, diff-context-face,
diff-nonexistent-face): Remove.
(diff-use-changed-face, diff-font-lock-keywords): Use non-obsolete face
symbols.
(diff-hunk-file-names): Fix comment.
(diff-refine-change): Remove.
(diff-refine-removed, diff-refine-added, diff-refine-hunk): Use
non-obsolete face.
* lisp/vc/log-view.el (log-view-file-face, log-view-message-face): Remove.
(log-view-font-lock-keywords): Use non-obsolete face names.
* lisp/vc/pcvs-info.el (cvs-header-face, cvs-filename-face, cvs-unknown-face,
cvs-handled-face, cvs-need-action-face, cvs-marked-face, cvs-msg-face):
* lisp/wid-edit.el (widget-documentation-face, widget-button-face,
widget-field-face, widget-single-line-field-face, widget-inactive-face,
widget-button-pressed-face):
* lisp/woman.el (woman-italic-face, woman-bold-face, woman-unknown-face,
woman-addition-face): Remove.
2016-06-23 17:13:11 -04:00
|
|
|
|
;; cf. diff-font-lock-keywords / diff-file-header
|
2020-09-12 19:44:06 -07:00
|
|
|
|
;; FIXME if there are nonascii characters in the file names,
|
|
|
|
|
;; GNU diff displays them as octal escapes.
|
|
|
|
|
;; This function should undo that, so as to return file names
|
|
|
|
|
;; that are usable in Emacs.
|
2015-04-08 21:47:50 -04:00
|
|
|
|
(if (looking-at "[-*][-*][-*] \\([^\t\n]+\\).*\n[-+][-+][-+] \\([^\t\n]+\\)")
|
2013-02-28 11:34:51 -05:00
|
|
|
|
(list (if old (match-string 1) (match-string 2))
|
|
|
|
|
(if old (match-string 2) (match-string 1)))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(forward-line 1) nil)))
|
|
|
|
|
(delq nil
|
|
|
|
|
(append
|
|
|
|
|
(when (and (not old)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(re-search-backward "^Index: \\(.+\\)" limit t)))
|
|
|
|
|
(list (match-string 1)))
|
|
|
|
|
header-files
|
2013-02-28 11:34:51 -05:00
|
|
|
|
;; this assumes that there are no spaces in filenames
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(when (re-search-backward
|
|
|
|
|
"^diff \\(-\\S-+ +\\)*\\(\\S-+\\)\\( +\\(\\S-+\\)\\)?"
|
|
|
|
|
nil t)
|
|
|
|
|
(list (if old (match-string 2) (match-string 4))
|
|
|
|
|
(if old (match-string 4) (match-string 2)))))))))
|
|
|
|
|
|
2008-09-14 21:16:30 +00:00
|
|
|
|
(defun diff-find-file-name (&optional old noprompt prefix)
|
2004-03-23 20:50:36 +00:00
|
|
|
|
"Return the file corresponding to the current patch.
|
2006-07-02 14:29:28 +00:00
|
|
|
|
Non-nil OLD means that we want the old file.
|
2008-09-14 21:16:30 +00:00
|
|
|
|
Non-nil NOPROMPT means to prefer returning nil than to prompt the user.
|
2006-07-02 14:29:28 +00:00
|
|
|
|
PREFIX is only used internally: don't use it."
|
2008-03-25 04:01:48 +00:00
|
|
|
|
(unless (equal diff-remembered-defdir default-directory)
|
|
|
|
|
;; Flush diff-remembered-files-alist if the default-directory is changed.
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
(setq-local diff-remembered-defdir default-directory)
|
|
|
|
|
(setq-local diff-remembered-files-alist nil))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(save-excursion
|
2017-08-22 15:57:01 +02:00
|
|
|
|
(save-restriction
|
|
|
|
|
(widen)
|
|
|
|
|
(unless (looking-at diff-file-header-re)
|
|
|
|
|
(or (ignore-errors (diff-beginning-of-file))
|
|
|
|
|
(re-search-forward diff-file-header-re nil t)))
|
|
|
|
|
(let ((fs (diff-hunk-file-names old)))
|
|
|
|
|
(if prefix (setq fs (mapcar (lambda (f) (concat prefix f)) fs)))
|
|
|
|
|
(or
|
|
|
|
|
;; use any previously used preference
|
|
|
|
|
(cdr (assoc fs diff-remembered-files-alist))
|
|
|
|
|
;; try to be clever and use previous choices as an inspiration
|
|
|
|
|
(cl-dolist (rf diff-remembered-files-alist)
|
|
|
|
|
(let ((newfile (diff-merge-strings (caar rf) (car fs) (cdr rf))))
|
|
|
|
|
(if (and newfile (file-exists-p newfile)) (cl-return newfile))))
|
|
|
|
|
;; look for each file in turn. If none found, try again but
|
|
|
|
|
;; ignoring the first level of directory, ...
|
2018-02-18 00:47:00 -05:00
|
|
|
|
(cl-do* ((files fs (delq nil (mapcar #'diff-filename-drop-dir files)))
|
2017-08-22 15:57:01 +02:00
|
|
|
|
(file nil nil))
|
|
|
|
|
((or (null files)
|
|
|
|
|
(setq file (cl-do* ((files files (cdr files))
|
|
|
|
|
(file (car files) (car files)))
|
|
|
|
|
;; Use file-regular-p to avoid
|
|
|
|
|
;; /dev/null, directories, etc.
|
|
|
|
|
((or (null file) (file-regular-p file))
|
|
|
|
|
file))))
|
|
|
|
|
file))
|
|
|
|
|
;; <foo>.rej patches implicitly apply to <foo>
|
|
|
|
|
(and (string-match "\\.rej\\'" (or buffer-file-name ""))
|
|
|
|
|
(let ((file (substring buffer-file-name 0 (match-beginning 0))))
|
|
|
|
|
(when (file-exists-p file) file)))
|
|
|
|
|
;; If we haven't found the file, maybe it's because we haven't paid
|
|
|
|
|
;; attention to the PCL-CVS hint.
|
|
|
|
|
(and (not prefix)
|
|
|
|
|
(boundp 'cvs-pcl-cvs-dirchange-re)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(re-search-backward cvs-pcl-cvs-dirchange-re nil t))
|
|
|
|
|
(diff-find-file-name old noprompt (match-string 1)))
|
|
|
|
|
;; if all else fails, ask the user
|
|
|
|
|
(unless noprompt
|
|
|
|
|
(let ((file (expand-file-name (or (car fs) ""))))
|
|
|
|
|
(setq file
|
|
|
|
|
(read-file-name (format "Use file %s: " file)
|
|
|
|
|
(file-name-directory file) file t
|
|
|
|
|
(file-name-nondirectory file)))
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
(setq-local diff-remembered-files-alist
|
|
|
|
|
(cons (cons fs file) diff-remembered-files-alist))
|
2017-08-22 15:57:01 +02:00
|
|
|
|
file)))))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2000-09-29 18:05:27 +00:00
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(defun diff-ediff-patch ()
|
|
|
|
|
"Call `ediff-patch-file' on the current buffer."
|
|
|
|
|
(interactive)
|
2011-03-11 15:04:22 -05:00
|
|
|
|
(condition-case nil
|
2000-05-10 22:12:46 +00:00
|
|
|
|
(ediff-patch-file nil (current-buffer))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(wrong-number-of-arguments (ediff-patch-file))))
|
|
|
|
|
|
2003-02-04 11:26:42 +00:00
|
|
|
|
;;;;
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;;;; Conversion functions
|
2003-02-04 11:26:42 +00:00
|
|
|
|
;;;;
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
;;(defvar diff-inhibit-after-change nil
|
|
|
|
|
;; "Non-nil means inhibit `diff-mode's after-change functions.")
|
|
|
|
|
|
|
|
|
|
(defun diff-unified->context (start end)
|
|
|
|
|
"Convert unified diffs to context diffs.
|
|
|
|
|
START and END are either taken from the region (if a prefix arg is given) or
|
2007-08-06 20:08:55 +00:00
|
|
|
|
else cover the whole buffer."
|
2012-10-29 11:14:10 -04:00
|
|
|
|
(interactive (if (or current-prefix-arg (use-region-p))
|
2006-05-09 23:06:14 +00:00
|
|
|
|
(list (region-beginning) (region-end))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(list (point-min) (point-max))))
|
2006-07-02 14:29:28 +00:00
|
|
|
|
(unless (markerp end) (setq end (copy-marker end t)))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(let (;;(diff-inhibit-after-change t)
|
|
|
|
|
(inhibit-read-only t))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char start)
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(while (and (re-search-forward
|
|
|
|
|
(concat "^\\(\\(---\\) .+\n\\(\\+\\+\\+\\) .+\\|"
|
|
|
|
|
diff-hunk-header-re-unified ".*\\)$")
|
|
|
|
|
nil t)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(< (point) end))
|
|
|
|
|
(combine-after-change-calls
|
|
|
|
|
(if (match-beginning 2)
|
2000-05-10 22:12:46 +00:00
|
|
|
|
;; we matched a file header
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(progn
|
|
|
|
|
;; use reverse order to make sure the indices are kept valid
|
|
|
|
|
(replace-match "---" t t nil 3)
|
|
|
|
|
(replace-match "***" t t nil 2))
|
|
|
|
|
;; we matched a hunk header
|
|
|
|
|
(let ((line1 (match-string 4))
|
2008-04-25 02:08:43 +00:00
|
|
|
|
(lines1 (or (match-string 5) "1"))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(line2 (match-string 6))
|
2008-04-26 05:40:19 +00:00
|
|
|
|
(lines2 (or (match-string 7) "1"))
|
2007-07-22 21:38:28 +00:00
|
|
|
|
;; Variables to use the special undo function.
|
|
|
|
|
(old-undo buffer-undo-list)
|
|
|
|
|
(old-end (marker-position end))
|
|
|
|
|
(start (match-beginning 0))
|
|
|
|
|
(reversible t))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(replace-match
|
|
|
|
|
(concat "***************\n*** " line1 ","
|
|
|
|
|
(number-to-string (+ (string-to-number line1)
|
|
|
|
|
(string-to-number lines1)
|
2008-04-26 05:40:19 +00:00
|
|
|
|
-1))
|
|
|
|
|
" ****"))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(save-restriction
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(narrow-to-region (line-beginning-position 2)
|
|
|
|
|
;; Call diff-end-of-hunk from just before
|
|
|
|
|
;; the hunk header so it can use the hunk
|
|
|
|
|
;; header info.
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(progn (diff-end-of-hunk 'unified) (point)))
|
|
|
|
|
(let ((hunk (buffer-string)))
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(if (not (save-excursion (re-search-forward "^-" nil t)))
|
|
|
|
|
(delete-region (point) (point-max))
|
|
|
|
|
(goto-char (point-max))
|
|
|
|
|
(let ((modif nil) last-pt)
|
|
|
|
|
(while (progn (setq last-pt (point))
|
|
|
|
|
(= (forward-line -1) 0))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(pcase (char-after)
|
2005-07-04 03:11:31 +00:00
|
|
|
|
(?\s (insert " ") (setq modif nil) (backward-char 1))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(?+ (delete-region (point) last-pt) (setq modif t))
|
|
|
|
|
(?- (if (not modif)
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(progn (forward-char 1)
|
|
|
|
|
(insert " "))
|
|
|
|
|
(delete-char 1)
|
|
|
|
|
(insert "! "))
|
|
|
|
|
(backward-char 2))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(?\\ (when (save-excursion (forward-line -1)
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(= (char-after) ?+))
|
|
|
|
|
(delete-region (point) last-pt)
|
|
|
|
|
(setq modif t)))
|
2008-02-25 03:54:54 +00:00
|
|
|
|
;; diff-valid-unified-empty-line.
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(?\n (insert " ") (setq modif nil)
|
|
|
|
|
(backward-char 2))
|
|
|
|
|
(_ (setq modif nil))))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(goto-char (point-max))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(insert "--- " line2 ","
|
|
|
|
|
(number-to-string (+ (string-to-number line2)
|
|
|
|
|
(string-to-number lines2)
|
2008-04-26 05:40:19 +00:00
|
|
|
|
-1))
|
2008-02-25 03:54:54 +00:00
|
|
|
|
" ----\n" hunk))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;;(goto-char (point-min))
|
|
|
|
|
(forward-line 1)
|
Fix regular-expression glitches and typos
Problems reported by Mattias Engdegård in:
https://lists.gnu.org/r/emacs-devel/2019-03/msg00085.html
* admin/admin.el (set-version):
* lisp/allout.el (allout-latexify-one-item):
* lisp/arc-mode.el (archive-arc-rename-entry)
(archive-rar-summarize):
* lisp/calc/calc-graph.el (calc-graph-set-styles)
(calc-graph-hide):
* lisp/calc/calc-help.el (calc-describe-key):
* lisp/calc/calc-lang.el (math-compose-tex-func, eqn):
* lisp/calc/calc.el (calcDigit-key):
* lisp/cedet/ede/makefile-edit.el (makefile-macro-file-list):
* lisp/cedet/ede/speedbar.el (ede-tag-expand):
* lisp/cedet/semantic/sb.el (semantic-sb-show-extra)
(semantic-sb-expand-group):
* lisp/comint.el (comint-substitute-in-file-name):
* lisp/dired.el (dired-actual-switches):
* lisp/emacs-lisp/chart.el (chart-rmail-from):
* lisp/emacs-lisp/eieio-opt.el (eieio-sb-expand):
* lisp/emacs-lisp/eieio-speedbar.el (eieio-speedbar-object-expand):
* lisp/emacs-lisp/rx.el (rx-not, rx-atomic-p):
* lisp/emulation/viper-ex.el (viper-get-ex-token)
(viper-get-ex-pat, ex-set-read-variable):
* lisp/epg.el (epg--status-SIG_CREATED):
* lisp/erc/erc-speedbar.el (erc-speedbar-expand-user):
(erc-speedbar-expand-channel, erc-speedbar-expand-server)
* lisp/erc/erc.el (erc-is-message-ctcp-and-not-action-p)
(erc-banlist-update):
* lisp/eshell/em-dirs.el (eshell-parse-drive-letter, eshell/pwd):
* lisp/find-dired.el (find-dired):
* lisp/frame.el (frame-set-background-mode):
* lisp/generic-x.el (apache-log-generic-mode):
* lisp/gnus/gnus-art.el (gnus-button-valid-localpart-regexp):
* lisp/gnus/gnus.el (gnus-short-group-name):
* lisp/gnus/message.el (message-mailer-swallows-blank-line):
* lisp/ibuffer.el (ibuffer-fontification-alist):
* lisp/ido.el (ido-set-matches-1):
* lisp/info-xref.el (info-xref-lock-file-p):
* lisp/info.el (Info-dir-remove-duplicates)
(Info-unescape-quotes, Info-split-parameter-string)
(Info-speedbar-expand-node):
* lisp/international/mule.el (sgml-html-meta-auto-coding-function):
* lisp/isearch.el (isearch-pre-command-hook):
* lisp/language/ethio-util.el (ethio-fidel-to-tex-buffer):
* lisp/mail/rmail.el (rmail-collect-deleted):
* lisp/mh-e/mh-alias.el (mh-alias-suggest-alias):
* lisp/mh-e/mh-comp.el (mh-forward):
* lisp/mh-e/mh-search.el (mh-index-next-folder)
(mh-index-create-imenu-index):
* lisp/mh-e/mh-xface.el (mh-picon-get-image):
* lisp/minibuffer.el (completion--embedded-envvar-re):
* lisp/net/ange-ftp.el (ange-ftp-ls-parser):
* lisp/net/goto-addr.el (goto-address-mail-regexp)
(goto-address-find-address-at-point):
* lisp/net/pop3.el (pop3-read-response, pop3-user)
(pop3-pass, pop3-apop):
* lisp/net/tramp.el (tramp-ipv6-regexp)
(tramp-replace-environment-variables):
* lisp/nxml/nxml-maint.el (nxml-insert-target-repertoire-glyph-set):
* lisp/nxml/rng-uri.el (rng-uri-escape-multibyte):
* lisp/nxml/rng-xsd.el (rng-xsd-convert-any-uri):
* lisp/obsolete/pgg.el (pgg-fetch-key):
* lisp/obsolete/vip.el (vip-get-ex-token):
* lisp/org/ob-core.el (org-babel-string-read):
* lisp/org/org-agenda.el:
(org-agenda-add-entry-to-org-agenda-diary-file):
* lisp/org/org-element.el (org-element-keyword-parser):
* lisp/org/org-list.el (org-list-indent-item-generic):
* lisp/org/org-mhe.el (org-mhe-get-message-folder-from-index):
* lisp/org/org-mobile.el (org-mobile-apply):
* lisp/org/org-mouse.el (org-mouse-context-menu):
* lisp/org/org-plot.el (org-plot/gnuplot):
* lisp/org/org-protocol.el (org-protocol-flatten-greedy):
* lisp/org/org-table.el (org-table-copy-down)
(org-table-formula-make-cmp-string)
(org-table-get-stored-formulas, org-table-recalculate)
(org-table-edit-formulas):
* lisp/org/org.el (org-translate-link-from-planner)
(org-fill-line-break-nobreak-p):
* lisp/org/ox-ascii.el (org-ascii-item):
* lisp/org/ox-latex.el (org-latex-clean-invalid-line-breaks):
* lisp/org/ox.el (org-export-expand-include-keyword):
* lisp/progmodes/ada-xref.el (ada-treat-cmd-string):
* lisp/progmodes/cfengine.el (cfengine2-font-lock-keywords):
* lisp/progmodes/cperl-mode.el (cperl-to-comment-or-eol)
(cperl-find-pods-heres, cperl-fix-line-spacing)
(cperl-have-help-regexp, cperl-word-at-point-hard)
(cperl-make-regexp-x):
* lisp/progmodes/dcl-mode.el (dcl-option-value-offset):
* lisp/progmodes/etags.el (tag-implicit-name-match-p):
* lisp/progmodes/fortran.el (fortran-fill):
* lisp/progmodes/gdb-mi.el (gdb-speedbar-expand-node)
(gdb-locals-handler-custom):
* lisp/progmodes/grep.el (grep-mode-font-lock-keywords):
* lisp/progmodes/gud.el (gud-jdb-find-source-using-classpath):
* lisp/progmodes/js.el (js--continued-expression-p):
* lisp/progmodes/m4-mode.el (m4-font-lock-keywords):
* lisp/progmodes/meta-mode.el (meta-indent-level-count):
* lisp/progmodes/mixal-mode.el (mixal-font-lock-keywords):
* lisp/progmodes/opascal.el (opascal-find-unit-in-directory):
* lisp/progmodes/pascal.el (pascal-progbeg-re):
* lisp/progmodes/ruby-mode.el (ruby-expression-expansion-re)
(ruby-expr-beg, ruby-parse-partial)
(ruby-toggle-string-quotes, ruby-font-lock-keywords):
* lisp/progmodes/sql.el (sql--make-help-docstring):
* lisp/progmodes/verilog-mode.el (verilog-coverpoint-re)
(verilog-skip-forward-comment-p)
(verilog-read-sub-decls-gate)
(verilog-read-auto-template-middle):
* lisp/progmodes/vhdl-mode.el (vhdl-resolve-env-variable)
(vhdl-speedbar-expand-project, vhdl-speedbar-expand-entity)
(vhdl-speedbar-expand-architecture)
(vhdl-speedbar-expand-config, vhdl-speedbar-expand-package)
(vhdl-speedbar-dired):
* lisp/speedbar.el (speedbar-dired, speedbar-tag-file)
(speedbar-tag-expand):
* lisp/textmodes/dns-mode.el (dns-mode-font-lock-keywords):
* lisp/textmodes/flyspell.el (flyspell-debug-signal-word-checked):
* lisp/textmodes/ispell.el (ispell-process-line):
* lisp/textmodes/reftex-cite.el (reftex-end-of-bib-entry):
* lisp/textmodes/reftex-ref.el (reftex-replace-prefix-escapes):
* lisp/url/url-parse.el (url-generic-parse-url):
* lisp/url/url-util.el (url-truncate-url-for-viewing):
* lisp/vc/diff-mode.el (diff-unified->context):
* lisp/vc/vc-bzr.el (vc-bzr-error-regexp-alist):
* lisp/vc/vc-cvs.el (vc-cvs-parse-status):
* lisp/woman.el (woman0-el, woman-if-ignore)
(woman-change-fonts):
* lisp/xdg.el (xdg--substitute-home-env):
Fix regular-expression infelicities and typos.
Fix regular expression typos
Fix typos reported by Mattias Engdegård in:
that occurred in preloaded modules.
* lisp/frame.el (frame-set-background-mode):
* lisp/international/mule.el (sgml-html-meta-auto-coding-function):
* lisp/isearch.el (isearch-pre-command-hook):
* lisp/minibuffer.el (completion--embedded-envvar-re):
2019-03-04 18:00:00 -08:00
|
|
|
|
(if (not (save-excursion (re-search-forward "^\\+" nil t)))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(delete-region (point) (point-max))
|
|
|
|
|
(let ((modif nil) (delete nil))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(if (save-excursion (re-search-forward "^\\+.*\n-"
|
|
|
|
|
nil t))
|
2007-07-22 21:38:28 +00:00
|
|
|
|
;; Normally, lines in a substitution come with
|
|
|
|
|
;; first the removals and then the additions, and
|
|
|
|
|
;; the context->unified function follows this
|
|
|
|
|
;; convention, of course. Yet, other alternatives
|
|
|
|
|
;; are valid as well, but they preclude the use of
|
|
|
|
|
;; context->unified as an undo command.
|
|
|
|
|
(setq reversible nil))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(while (not (eobp))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(pcase (char-after)
|
2005-07-04 03:11:31 +00:00
|
|
|
|
(?\s (insert " ") (setq modif nil) (backward-char 1))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(?- (setq delete t) (setq modif t))
|
|
|
|
|
(?+ (if (not modif)
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(progn (forward-char 1)
|
|
|
|
|
(insert " "))
|
|
|
|
|
(delete-char 1)
|
|
|
|
|
(insert "! "))
|
|
|
|
|
(backward-char 2))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(?\\ (when (save-excursion (forward-line 1)
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(not (eobp)))
|
|
|
|
|
(setq delete t) (setq modif t)))
|
2008-02-25 03:54:54 +00:00
|
|
|
|
;; diff-valid-unified-empty-line.
|
|
|
|
|
(?\n (insert " ") (setq modif nil) (backward-char 2)
|
|
|
|
|
(setq reversible nil))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(_ (setq modif nil)))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(let ((last-pt (point)))
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(when delete
|
|
|
|
|
(delete-region last-pt (point))
|
2007-07-22 21:38:28 +00:00
|
|
|
|
(setq delete nil)))))))
|
|
|
|
|
(unless (or (not reversible) (eq buffer-undo-list t))
|
|
|
|
|
;; Drop the many undo entries and replace them with
|
|
|
|
|
;; a single entry that uses diff-context->unified to do
|
|
|
|
|
;; the work.
|
|
|
|
|
(setq buffer-undo-list
|
|
|
|
|
(cons (list 'apply (- old-end end) start (point-max)
|
|
|
|
|
'diff-context->unified start (point-max))
|
|
|
|
|
old-undo)))))))))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2006-05-02 01:39:40 +00:00
|
|
|
|
(defun diff-context->unified (start end &optional to-context)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
"Convert context diffs to unified diffs.
|
2006-05-02 01:39:40 +00:00
|
|
|
|
START and END are either taken from the region
|
|
|
|
|
\(when it is highlighted) or else cover the whole buffer.
|
|
|
|
|
With a prefix argument, convert unified format to context format."
|
2012-10-29 11:14:10 -04:00
|
|
|
|
(interactive (if (use-region-p)
|
2006-05-09 23:06:14 +00:00
|
|
|
|
(list (region-beginning) (region-end) current-prefix-arg)
|
2006-05-02 01:39:40 +00:00
|
|
|
|
(list (point-min) (point-max) current-prefix-arg)))
|
|
|
|
|
(if to-context
|
|
|
|
|
(diff-unified->context start end)
|
2006-07-02 14:29:28 +00:00
|
|
|
|
(unless (markerp end) (setq end (copy-marker end t)))
|
2006-05-02 01:39:40 +00:00
|
|
|
|
(let ( ;;(diff-inhibit-after-change t)
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(inhibit-read-only t))
|
2006-05-02 01:39:40 +00:00
|
|
|
|
(save-excursion
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(goto-char start)
|
2012-10-29 11:14:10 -04:00
|
|
|
|
(while (and (re-search-forward "^\\(\\(\\*\\*\\*\\) .+\n\\(---\\) .+\\|\\*\\{15\\}.*\n\\*\\*\\* \\([0-9]+\\),\\(-?[0-9]+\\) \\*\\*\\*\\*\\)\\(?: \\(.*\\)\\|$\\)" nil t)
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(< (point) end))
|
|
|
|
|
(combine-after-change-calls
|
|
|
|
|
(if (match-beginning 2)
|
|
|
|
|
;; we matched a file header
|
|
|
|
|
(progn
|
|
|
|
|
;; use reverse order to make sure the indices are kept valid
|
|
|
|
|
(replace-match "+++" t t nil 3)
|
|
|
|
|
(replace-match "---" t t nil 2))
|
|
|
|
|
;; we matched a hunk header
|
|
|
|
|
(let ((line1s (match-string 4))
|
|
|
|
|
(line1e (match-string 5))
|
|
|
|
|
(pt1 (match-beginning 0))
|
|
|
|
|
;; Variables to use the special undo function.
|
|
|
|
|
(old-undo buffer-undo-list)
|
|
|
|
|
(old-end (marker-position end))
|
2012-10-29 11:14:10 -04:00
|
|
|
|
;; We currently throw away the comment that can follow
|
|
|
|
|
;; the hunk header. FIXME: Preserve it instead!
|
|
|
|
|
(reversible (not (match-end 6))))
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(replace-match "")
|
|
|
|
|
(unless (re-search-forward
|
2008-05-26 17:25:44 +00:00
|
|
|
|
diff-context-mid-hunk-header-re nil t)
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(error "Can't find matching `--- n1,n2 ----' line"))
|
|
|
|
|
(let ((line2s (match-string 1))
|
|
|
|
|
(line2e (match-string 2))
|
|
|
|
|
(pt2 (progn
|
|
|
|
|
(delete-region (progn (beginning-of-line) (point))
|
|
|
|
|
(progn (forward-line 1) (point)))
|
|
|
|
|
(point-marker))))
|
|
|
|
|
(goto-char pt1)
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(while (< (point) pt2)
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(pcase (char-after)
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(?! (delete-char 2) (insert "-") (forward-line 1))
|
|
|
|
|
(?- (forward-char 1) (delete-char 1) (forward-line 1))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(?\s ;merge with the other half of the chunk
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(let* ((endline2
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char pt2) (forward-line 1) (point))))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(pcase (char-after pt2)
|
|
|
|
|
((or ?! ?+)
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(insert "+"
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(prog1
|
|
|
|
|
(buffer-substring (+ pt2 2) endline2)
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(delete-region pt2 endline2))))
|
|
|
|
|
(?\s
|
|
|
|
|
(unless (= (- endline2 pt2)
|
|
|
|
|
(- (line-beginning-position 2) (point)))
|
|
|
|
|
;; If the two lines we're merging don't have the
|
|
|
|
|
;; same length (can happen with "diff -b"), then
|
|
|
|
|
;; diff-unified->context will not properly undo
|
|
|
|
|
;; this operation.
|
|
|
|
|
(setq reversible nil))
|
|
|
|
|
(delete-region pt2 endline2)
|
|
|
|
|
(delete-char 1)
|
|
|
|
|
(forward-line 1))
|
|
|
|
|
(?\\ (forward-line 1))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(_ (setq reversible nil)
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(delete-char 1) (forward-line 1)))))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(_ (setq reversible nil) (forward-line 1))))
|
2007-10-09 04:12:24 +00:00
|
|
|
|
(while (looking-at "[+! ] ")
|
|
|
|
|
(if (/= (char-after) ?!) (forward-char 1)
|
|
|
|
|
(delete-char 1) (insert "+"))
|
|
|
|
|
(delete-char 1) (forward-line 1))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char pt1)
|
|
|
|
|
(insert "@@ -" line1s ","
|
|
|
|
|
(number-to-string (- (string-to-number line1e)
|
|
|
|
|
(string-to-number line1s)
|
|
|
|
|
-1))
|
|
|
|
|
" +" line2s ","
|
|
|
|
|
(number-to-string (- (string-to-number line2e)
|
|
|
|
|
(string-to-number line2s)
|
|
|
|
|
-1)) " @@"))
|
|
|
|
|
(set-marker pt2 nil)
|
|
|
|
|
;; The whole procedure succeeded, let's replace the myriad
|
|
|
|
|
;; of undo elements with just a single special one.
|
|
|
|
|
(unless (or (not reversible) (eq buffer-undo-list t))
|
|
|
|
|
(setq buffer-undo-list
|
|
|
|
|
(cons (list 'apply (- old-end end) pt1 (point)
|
|
|
|
|
'diff-unified->context pt1 (point))
|
|
|
|
|
old-undo)))
|
|
|
|
|
)))))))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
(defun diff-reverse-direction (start end)
|
|
|
|
|
"Reverse the direction of the diffs.
|
|
|
|
|
START and END are either taken from the region (if a prefix arg is given) or
|
2007-08-06 20:08:55 +00:00
|
|
|
|
else cover the whole buffer."
|
2012-10-29 11:14:10 -04:00
|
|
|
|
(interactive (if (or current-prefix-arg (use-region-p))
|
2006-05-09 23:06:14 +00:00
|
|
|
|
(list (region-beginning) (region-end))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(list (point-min) (point-max))))
|
2006-07-02 14:29:28 +00:00
|
|
|
|
(unless (markerp end) (setq end (copy-marker end t)))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(let (;;(diff-inhibit-after-change t)
|
|
|
|
|
(inhibit-read-only t))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char start)
|
2000-06-05 07:30:09 +00:00
|
|
|
|
(while (and (re-search-forward "^\\(\\([-*][-*][-*] \\)\\(.+\\)\n\\([-+][-+][-+] \\)\\(.+\\)\\|\\*\\{15\\}.*\n\\*\\*\\* \\(.+\\) \\*\\*\\*\\*\\|@@ -\\([0-9,]+\\) \\+\\([0-9,]+\\) @@.*\\)$" nil t)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(< (point) end))
|
|
|
|
|
(combine-after-change-calls
|
|
|
|
|
(cond
|
|
|
|
|
;; a file header
|
|
|
|
|
((match-beginning 2) (replace-match "\\2\\5\n\\4\\3" nil))
|
|
|
|
|
;; a context-diff hunk header
|
|
|
|
|
((match-beginning 6)
|
|
|
|
|
(let ((pt-lines1 (match-beginning 6))
|
|
|
|
|
(lines1 (match-string 6)))
|
|
|
|
|
(replace-match "" nil nil nil 6)
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(let ((half1s (point)))
|
2000-05-10 22:12:46 +00:00
|
|
|
|
(while (looking-at "[-! \\][ \t]\\|#")
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(when (= (char-after) ?-) (delete-char 1) (insert "+"))
|
|
|
|
|
(forward-line 1))
|
2000-02-07 02:01:07 +00:00
|
|
|
|
(let ((half1 (delete-and-extract-region half1s (point))))
|
2008-05-26 17:25:44 +00:00
|
|
|
|
(unless (looking-at diff-context-mid-hunk-header-re)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(insert half1)
|
|
|
|
|
(error "Can't find matching `--- n1,n2 ----' line"))
|
2008-05-26 17:25:44 +00:00
|
|
|
|
(let* ((str1end (or (match-end 2) (match-end 1)))
|
|
|
|
|
(str1 (buffer-substring (match-beginning 1) str1end)))
|
|
|
|
|
(goto-char str1end)
|
|
|
|
|
(insert lines1)
|
|
|
|
|
(delete-region (match-beginning 1) str1end)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(forward-line 1)
|
|
|
|
|
(let ((half2s (point)))
|
2000-05-10 22:12:46 +00:00
|
|
|
|
(while (looking-at "[!+ \\][ \t]\\|#")
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(when (= (char-after) ?+) (delete-char 1) (insert "-"))
|
|
|
|
|
(forward-line 1))
|
2000-02-07 02:01:07 +00:00
|
|
|
|
(let ((half2 (delete-and-extract-region half2s (point))))
|
2000-05-10 22:12:46 +00:00
|
|
|
|
(insert (or half1 ""))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(goto-char half1s)
|
2000-05-10 22:12:46 +00:00
|
|
|
|
(insert (or half2 ""))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(goto-char pt-lines1)
|
|
|
|
|
(insert str1))))))
|
|
|
|
|
;; a unified-diff hunk header
|
|
|
|
|
((match-beginning 7)
|
|
|
|
|
(replace-match "@@ -\\8 +\\7 @@" nil)
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(let ((c (char-after)) first last)
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(while (pcase (setq c (char-after))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(?- (setq first (or first (point)))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(delete-char 1) (insert "+") t)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(?+ (setq last (or last (point)))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(delete-char 1) (insert "-") t)
|
|
|
|
|
((or ?\\ ?#) t)
|
|
|
|
|
(_ (when (and first last (< first last))
|
2002-07-16 13:37:15 +00:00
|
|
|
|
(insert (delete-and-extract-region first last)))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(setq first nil last nil)
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(memq c (if diff-valid-unified-empty-line
|
|
|
|
|
'(?\s ?\n) '(?\s)))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(forward-line 1))))))))))
|
|
|
|
|
|
|
|
|
|
(defun diff-fixup-modifs (start end)
|
|
|
|
|
"Fixup the hunk headers (in case the buffer was modified).
|
|
|
|
|
START and END are either taken from the region (if a prefix arg is given) or
|
2007-08-06 20:08:55 +00:00
|
|
|
|
else cover the whole buffer."
|
2012-10-29 11:14:10 -04:00
|
|
|
|
(interactive (if (or current-prefix-arg (use-region-p))
|
2006-05-09 23:06:14 +00:00
|
|
|
|
(list (region-beginning) (region-end))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(list (point-min) (point-max))))
|
|
|
|
|
(let ((inhibit-read-only t))
|
|
|
|
|
(save-excursion
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(goto-char end) (diff-end-of-hunk nil 'donttrustheader)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(let ((plus 0) (minus 0) (space 0) (bang 0))
|
2011-05-15 11:51:21 -07:00
|
|
|
|
(while (and (= (forward-line -1) 0) (<= start (point)))
|
2011-05-16 14:29:35 +02:00
|
|
|
|
(if (not (looking-at
|
|
|
|
|
(concat diff-hunk-header-re-unified
|
|
|
|
|
"\\|[-*][-*][-*] [0-9,]+ [-*][-*][-*][-*]$"
|
|
|
|
|
"\\|--- .+\n\\+\\+\\+ ")))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(pcase (char-after)
|
|
|
|
|
(?\s (cl-incf space))
|
|
|
|
|
(?+ (cl-incf plus))
|
|
|
|
|
(?- (cl-incf minus))
|
|
|
|
|
(?! (cl-incf bang))
|
|
|
|
|
((or ?\\ ?#) nil)
|
2014-08-16 21:51:27 +02:00
|
|
|
|
(?\n (if diff-valid-unified-empty-line
|
|
|
|
|
(cl-incf space)
|
|
|
|
|
(setq space 0 plus 0 minus 0 bang 0)))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(_ (setq space 0 plus 0 minus 0 bang 0)))
|
2011-05-16 14:29:35 +02:00
|
|
|
|
(cond
|
|
|
|
|
((looking-at diff-hunk-header-re-unified)
|
|
|
|
|
(let* ((old1 (match-string 2))
|
|
|
|
|
(old2 (match-string 4))
|
|
|
|
|
(new1 (number-to-string (+ space minus)))
|
|
|
|
|
(new2 (number-to-string (+ space plus))))
|
|
|
|
|
(if old2
|
|
|
|
|
(unless (string= new2 old2) (replace-match new2 t t nil 4))
|
|
|
|
|
(goto-char (match-end 3))
|
|
|
|
|
(insert "," new2))
|
|
|
|
|
(if old1
|
|
|
|
|
(unless (string= new1 old1) (replace-match new1 t t nil 2))
|
|
|
|
|
(goto-char (match-end 1))
|
|
|
|
|
(insert "," new1))))
|
|
|
|
|
((looking-at diff-context-mid-hunk-header-re)
|
|
|
|
|
(when (> (+ space bang plus) 0)
|
|
|
|
|
(let* ((old1 (match-string 1))
|
|
|
|
|
(old2 (match-string 2))
|
|
|
|
|
(new (number-to-string
|
|
|
|
|
(+ space bang plus -1 (string-to-number old1)))))
|
|
|
|
|
(unless (string= new old2) (replace-match new t t nil 2)))))
|
|
|
|
|
((looking-at "\\*\\*\\* \\([0-9]+\\),\\(-?[0-9]*\\) \\*\\*\\*\\*$")
|
|
|
|
|
(when (> (+ space bang minus) 0)
|
|
|
|
|
(let* ((old (match-string 1))
|
|
|
|
|
(new (format
|
|
|
|
|
(concat "%0" (number-to-string (length old)) "d")
|
|
|
|
|
(+ space bang minus -1 (string-to-number old)))))
|
|
|
|
|
(unless (string= new old) (replace-match new t t nil 2))))))
|
|
|
|
|
(setq space 0 plus 0 minus 0 bang 0)))))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2003-02-04 11:26:42 +00:00
|
|
|
|
;;;;
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;;;; Hooks
|
2003-02-04 11:26:42 +00:00
|
|
|
|
;;;;
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
(defun diff-write-contents-hooks ()
|
|
|
|
|
"Fixup hunk headers if necessary."
|
|
|
|
|
(if (buffer-modified-p) (diff-fixup-modifs (point-min) (point-max)))
|
|
|
|
|
nil)
|
|
|
|
|
|
|
|
|
|
;; It turns out that making changes in the buffer from within an
|
|
|
|
|
;; *-change-function is asking for trouble, whereas making them
|
|
|
|
|
;; from a post-command-hook doesn't pose much problems
|
|
|
|
|
(defvar diff-unhandled-changes nil)
|
2011-03-11 15:04:22 -05:00
|
|
|
|
(defun diff-after-change-function (beg end _len)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
"Remember to fixup the hunk header.
|
|
|
|
|
See `after-change-functions' for the meaning of BEG, END and LEN."
|
2000-06-05 07:30:09 +00:00
|
|
|
|
;; Ignoring changes when inhibit-read-only is set is strictly speaking
|
|
|
|
|
;; incorrect, but it turns out that inhibit-read-only is normally not set
|
|
|
|
|
;; inside editing commands, while it tends to be set when the buffer gets
|
|
|
|
|
;; updated by an async process or by a conversion function, both of which
|
|
|
|
|
;; would rather not be uselessly slowed down by this hook.
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(when (and (not undo-in-progress) (not inhibit-read-only))
|
|
|
|
|
(if diff-unhandled-changes
|
|
|
|
|
(setq diff-unhandled-changes
|
|
|
|
|
(cons (min beg (car diff-unhandled-changes))
|
2002-07-16 13:37:15 +00:00
|
|
|
|
(max end (cdr diff-unhandled-changes))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(setq diff-unhandled-changes (cons beg end)))))
|
|
|
|
|
|
|
|
|
|
(defun diff-post-command-hook ()
|
|
|
|
|
"Fixup hunk headers if necessary."
|
|
|
|
|
(when (consp diff-unhandled-changes)
|
|
|
|
|
(ignore-errors
|
|
|
|
|
(save-excursion
|
2000-02-07 02:01:07 +00:00
|
|
|
|
(goto-char (car diff-unhandled-changes))
|
2002-07-16 13:37:15 +00:00
|
|
|
|
;; Maybe we've cut the end of the hunk before point.
|
|
|
|
|
(if (and (bolp) (not (bobp))) (backward-char 1))
|
2008-05-26 17:25:44 +00:00
|
|
|
|
;; We used to fixup modifs on all the changes, but it turns out that
|
|
|
|
|
;; it's safer not to do it on big changes, e.g. when yanking a big
|
|
|
|
|
;; diff, or when the user edits the header, since we might then
|
|
|
|
|
;; screw up perfectly correct values. --Stef
|
2017-01-21 11:54:55 +09:00
|
|
|
|
(diff-beginning-of-hunk t)
|
2008-05-26 17:25:44 +00:00
|
|
|
|
(let* ((style (if (looking-at "\\*\\*\\*") 'context))
|
|
|
|
|
(start (line-beginning-position (if (eq style 'context) 3 2)))
|
|
|
|
|
(mid (if (eq style 'context)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(re-search-forward diff-context-mid-hunk-header-re
|
|
|
|
|
nil t)))))
|
|
|
|
|
(when (and ;; Don't try to fixup changes in the hunk header.
|
2012-12-19 14:41:43 -05:00
|
|
|
|
(>= (car diff-unhandled-changes) start)
|
2008-05-26 17:25:44 +00:00
|
|
|
|
;; Don't try to fixup changes in the mid-hunk header either.
|
|
|
|
|
(or (not mid)
|
|
|
|
|
(< (cdr diff-unhandled-changes) (match-beginning 0))
|
|
|
|
|
(> (car diff-unhandled-changes) (match-end 0)))
|
|
|
|
|
(save-excursion
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(diff-end-of-hunk nil 'donttrustheader)
|
2008-05-26 17:25:44 +00:00
|
|
|
|
;; Don't try to fixup changes past the end of the hunk.
|
|
|
|
|
(>= (point) (cdr diff-unhandled-changes))))
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(diff-fixup-modifs (point) (cdr diff-unhandled-changes)))))
|
2008-05-26 17:25:44 +00:00
|
|
|
|
(setq diff-unhandled-changes nil))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2004-04-22 22:57:09 +00:00
|
|
|
|
(defun diff-next-error (arg reset)
|
|
|
|
|
;; Select a window that displays the current buffer so that point
|
|
|
|
|
;; movements are reflected in that window. Otherwise, the user might
|
|
|
|
|
;; never see the hunk corresponding to the source she's jumping to.
|
|
|
|
|
(pop-to-buffer (current-buffer))
|
|
|
|
|
(if reset (goto-char (point-min)))
|
|
|
|
|
(diff-hunk-next arg)
|
|
|
|
|
(diff-goto-source))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2018-10-21 11:05:49 -04:00
|
|
|
|
(defun diff--font-lock-cleanup ()
|
|
|
|
|
(remove-overlays nil nil 'diff-mode 'fine)
|
2018-12-18 01:11:15 +02:00
|
|
|
|
(remove-overlays nil nil 'diff-mode 'syntax)
|
2018-10-21 11:05:49 -04:00
|
|
|
|
(when font-lock-mode
|
|
|
|
|
(make-local-variable 'font-lock-extra-managed-props)
|
|
|
|
|
;; Added when diff--font-lock-prettify is non-nil!
|
|
|
|
|
(cl-pushnew 'display font-lock-extra-managed-props)))
|
|
|
|
|
|
2009-01-11 03:23:56 +00:00
|
|
|
|
(defvar whitespace-style)
|
|
|
|
|
(defvar whitespace-trailing-regexp)
|
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;;;###autoload
|
2000-03-21 16:59:17 +00:00
|
|
|
|
(define-derived-mode diff-mode fundamental-mode "Diff"
|
1999-12-07 07:04:03 +00:00
|
|
|
|
"Major mode for viewing/editing context diffs.
|
2001-09-22 19:11:24 +00:00
|
|
|
|
Supports unified and context diffs as well as (to a lesser extent)
|
2007-04-06 18:45:34 +00:00
|
|
|
|
normal diffs.
|
2007-03-05 03:14:25 +00:00
|
|
|
|
|
2002-09-12 21:44:23 +00:00
|
|
|
|
When the buffer is read-only, the ESC prefix is not necessary.
|
2005-06-14 14:34:40 +00:00
|
|
|
|
If you edit the buffer manually, diff-mode will try to update the hunk
|
2002-09-12 21:44:23 +00:00
|
|
|
|
headers for you on-the-fly.
|
|
|
|
|
|
|
|
|
|
You can also switch between context diff and unified diff with \\[diff-context->unified],
|
2005-10-16 21:49:00 +00:00
|
|
|
|
or vice versa with \\[diff-unified->context] and you can also reverse the direction of
|
2006-07-02 14:29:28 +00:00
|
|
|
|
a diff with \\[diff-reverse-direction].
|
2007-03-05 03:14:25 +00:00
|
|
|
|
|
2018-10-21 11:05:49 -04:00
|
|
|
|
\\{diff-mode-map}"
|
2007-03-05 03:14:25 +00:00
|
|
|
|
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
(setq-local font-lock-defaults diff-font-lock-defaults)
|
2018-10-21 11:05:49 -04:00
|
|
|
|
(add-hook 'font-lock-mode-hook #'diff--font-lock-cleanup nil 'local)
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
(setq-local outline-regexp diff-outline-regexp)
|
|
|
|
|
(setq-local imenu-generic-expression
|
|
|
|
|
diff-imenu-generic-expression)
|
2000-09-07 20:16:22 +00:00
|
|
|
|
;; These are not perfect. They would be better done separately for
|
|
|
|
|
;; context diffs and unidiffs.
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
;; (setq-local paragraph-start
|
2000-09-07 20:16:22 +00:00
|
|
|
|
;; (concat "@@ " ; unidiff hunk
|
|
|
|
|
;; "\\|\\*\\*\\* " ; context diff hunk or file start
|
|
|
|
|
;; "\\|--- [^\t]+\t")) ; context or unidiff file
|
|
|
|
|
;; ; start (first or second line)
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
;; (setq-local paragraph-separate paragraph-start)
|
|
|
|
|
;; (setq-local page-delimiter "--- [^\t]+\t")
|
2000-09-07 20:16:22 +00:00
|
|
|
|
;; compile support
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
(setq-local next-error-function #'diff-next-error)
|
2001-01-24 23:26:40 +00:00
|
|
|
|
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
(setq-local beginning-of-defun-function #'diff-beginning-of-file-and-junk)
|
|
|
|
|
(setq-local end-of-defun-function #'diff-end-of-file)
|
2008-04-04 22:34:35 +00:00
|
|
|
|
|
2012-04-25 23:06:51 +08:00
|
|
|
|
(diff-setup-whitespace)
|
2009-01-10 17:21:04 +00:00
|
|
|
|
|
2013-11-22 18:55:17 -08:00
|
|
|
|
(if diff-default-read-only
|
|
|
|
|
(setq buffer-read-only t))
|
2001-09-22 19:11:24 +00:00
|
|
|
|
;; setup change hooks
|
2001-05-21 18:45:05 +00:00
|
|
|
|
(if (not diff-update-on-the-fly)
|
2018-02-18 00:47:00 -05:00
|
|
|
|
(add-hook 'write-contents-functions #'diff-write-contents-hooks nil t)
|
1999-10-09 23:52:39 +00:00
|
|
|
|
(make-local-variable 'diff-unhandled-changes)
|
2018-02-18 00:47:00 -05:00
|
|
|
|
(add-hook 'after-change-functions #'diff-after-change-function nil t)
|
|
|
|
|
(add-hook 'post-command-hook #'diff-post-command-hook nil t))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;; Neat trick from Dave Love to add more bindings in read-only mode:
|
2011-02-26 10:19:08 -05:00
|
|
|
|
(let ((ro-bind (cons 'buffer-read-only diff-mode-shared-map)))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(add-to-list 'minor-mode-overriding-map-alist ro-bind)
|
|
|
|
|
;; Turn off this little trick in case the buffer is put in view-mode.
|
|
|
|
|
(add-hook 'view-mode-hook
|
2006-07-02 14:29:28 +00:00
|
|
|
|
(lambda ()
|
|
|
|
|
(setq minor-mode-overriding-map-alist
|
|
|
|
|
(delq ro-bind minor-mode-overriding-map-alist)))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
nil t))
|
2000-09-20 22:37:10 +00:00
|
|
|
|
;; add-log support
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
(setq-local add-log-current-defun-function #'diff-current-defun)
|
|
|
|
|
(setq-local add-log-buffer-file-name-function
|
|
|
|
|
(lambda () (diff-find-file-name nil 'noprompt)))
|
2018-10-21 11:05:49 -04:00
|
|
|
|
(add-function :filter-return (local 'filter-buffer-substring-function)
|
|
|
|
|
#'diff--filter-substring)
|
2019-02-21 12:09:03 -05:00
|
|
|
|
(unless buffer-file-name
|
2019-10-13 05:52:21 +02:00
|
|
|
|
(hack-dir-local-variables-non-file-buffer))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(setq-local diff-buffer-type
|
|
|
|
|
(if (re-search-forward "^diff --git" nil t)
|
|
|
|
|
'git
|
|
|
|
|
nil))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
|
|
|
|
;;;###autoload
|
1999-12-07 07:04:03 +00:00
|
|
|
|
(define-minor-mode diff-minor-mode
|
2011-10-19 20:26:14 -04:00
|
|
|
|
"Toggle Diff minor mode.
|
|
|
|
|
|
1999-12-07 07:04:03 +00:00
|
|
|
|
\\{diff-minor-mode-map}"
|
2005-04-04 08:54:58 +00:00
|
|
|
|
:group 'diff-mode :lighter " Diff"
|
1999-12-07 07:04:03 +00:00
|
|
|
|
;; FIXME: setup font-lock
|
2000-02-07 02:01:07 +00:00
|
|
|
|
;; setup change hooks
|
2001-05-21 18:45:05 +00:00
|
|
|
|
(if (not diff-update-on-the-fly)
|
2018-02-18 00:47:00 -05:00
|
|
|
|
(add-hook 'write-contents-functions #'diff-write-contents-hooks nil t)
|
2000-02-07 02:01:07 +00:00
|
|
|
|
(make-local-variable 'diff-unhandled-changes)
|
2018-02-18 00:47:00 -05:00
|
|
|
|
(add-hook 'after-change-functions #'diff-after-change-function nil t)
|
|
|
|
|
(add-hook 'post-command-hook #'diff-post-command-hook nil t)))
|
1999-12-07 07:04:03 +00:00
|
|
|
|
|
2006-07-02 14:29:28 +00:00
|
|
|
|
;;; Handy hook functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2004-03-23 20:50:36 +00:00
|
|
|
|
|
2012-04-25 23:06:51 +08:00
|
|
|
|
(defun diff-setup-whitespace ()
|
|
|
|
|
"Set up Whitespace mode variables for the current Diff mode buffer.
|
|
|
|
|
This sets `whitespace-style' and `whitespace-trailing-regexp' so
|
|
|
|
|
that Whitespace mode shows trailing whitespace problems on the
|
|
|
|
|
modified lines of the diff."
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
(setq-local whitespace-style '(face trailing))
|
2012-04-25 23:06:51 +08:00
|
|
|
|
(let ((style (save-excursion
|
|
|
|
|
(goto-char (point-min))
|
2012-10-01 23:49:28 -04:00
|
|
|
|
;; FIXME: For buffers filled from async processes, this search
|
|
|
|
|
;; will simply fail because the buffer is still empty :-(
|
2012-04-25 23:06:51 +08:00
|
|
|
|
(when (re-search-forward diff-hunk-header-re nil t)
|
|
|
|
|
(goto-char (match-beginning 0))
|
|
|
|
|
(diff-hunk-style)))))
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
(setq-local whitespace-trailing-regexp
|
|
|
|
|
(if (eq style 'context)
|
|
|
|
|
"^[-+!] .*?\\([\t ]+\\)$"
|
|
|
|
|
"^[-+!<>].*?\\([\t ]+\\)$"))))
|
2012-04-25 23:06:51 +08:00
|
|
|
|
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(defun diff-delete-if-empty ()
|
|
|
|
|
;; An empty diff file means there's no more diffs to integrate, so we
|
|
|
|
|
;; can just remove the file altogether. Very handy for .rej files if we
|
|
|
|
|
;; remove hunks as we apply them.
|
|
|
|
|
(when (and buffer-file-name
|
file-attributes cleanup
Mostly, this replaces magic-number calls like (nth 4 A) with
more-informative calls like (file-attribute-access-time A).
It also fixes some documentation and minor timestamp coding
issues that I noticed while looking into this.
* doc/lispref/files.texi (File Attributes):
* lisp/files.el (file-attribute-size)
(file-attribute-inode-number, file-attribute-device-number):
* src/dired.c (Fdirectory_files_and_attributes)
(Ffile_attributes):
Mention which attributes must be integers, or nonnegative integers,
as opposed to merely being numbers. Remove no-longer-correct
talk about representing large integers as conses of integers.
* doc/lispref/files.texi (Magic File Names):
* doc/misc/gnus.texi (Low-level interface to the spam-stat dictionary):
* lisp/autorevert.el (auto-revert-find-file-function)
(auto-revert-tail-mode, auto-revert-handler):
* lisp/auth-source.el (auth-source-netrc-parse):
* lisp/cedet/ede/files.el (ede--inode-for-dir):
* lisp/cedet/semantic/db-file.el (object-write):
* lisp/cedet/semantic/db-mode.el (semanticdb-kill-hook):
* lisp/cedet/semantic/db.el (semanticdb-needs-refresh-p)
(semanticdb-synchronize):
* lisp/cedet/srecode/table.el (srecode-mode-table-new):
* lisp/desktop.el (desktop-save, desktop-read):
* lisp/dired-aux.el (dired-file-set-difference)
(dired-do-chxxx, dired-do-chmod, dired-copy-file-recursive)
(dired-create-files):
* lisp/dired.el (dired-directory-changed-p, dired-readin):
* lisp/dos-w32.el (w32-direct-print-region-helper):
* lisp/emacs-lisp/autoload.el (autoload-generate-file-autoloads)
(autoload-find-destination, update-directory-autoloads):
* lisp/emacs-lisp/shadow.el (load-path-shadows-same-file-or-nonexistent):
* lisp/epg.el (epg--start, epg-wait-for-completion):
* lisp/eshell/em-ls.el (eshell-ls-filetype-p)
(eshell-ls-applicable, eshell-ls-size-string)
(eshell-ls-file, eshell-ls-dir, eshell-ls-files)
(eshell-ls-entries):
* lisp/eshell/em-pred.el (eshell-predicate-alist)
(eshell-pred-file-type, eshell-pred-file-links)
(eshell-pred-file-size):
* lisp/eshell/em-unix.el (eshell-shuffle-files, eshell/cat)
(eshell-du-sum-directory, eshell/du):
* lisp/eshell/esh-util.el (eshell-read-passwd)
(eshell-read-hosts):
* lisp/files.el (remote-file-name-inhibit-cache)
(find-file-noselect, insert-file-1, dir-locals-find-file)
(dir-locals-read-from-dir, backup-buffer)
(file-ownership-preserved-p, copy-directory)
(read-file-modes):
* lisp/find-lisp.el (find-lisp-format):
* lisp/gnus/gnus-agent.el (gnus-agent-unfetch-articles)
(gnus-agent-read-agentview, gnus-agent-expire-group-1)
(gnus-agent-request-article, gnus-agent-regenerate-group)
(gnus-agent-update-files-total-fetched-for)
(gnus-agent-update-view-total-fetched-for):
* lisp/gnus/gnus-cache.el (gnus-cache-read-active)
(gnus-cache-update-file-total-fetched-for)
(gnus-cache-update-overview-total-fetched-for):
* lisp/gnus/gnus-cloud.el (gnus-cloud-file-new-p):
* lisp/gnus/gnus-score.el (gnus-score-score-files):
* lisp/gnus/gnus-start.el (gnus-save-newsrc-file)
(gnus-master-read-slave-newsrc):
* lisp/gnus/gnus-sum.el (gnus-summary-import-article):
* lisp/gnus/gnus-util.el (gnus-file-newer-than)
(gnus-cache-file-contents):
* lisp/gnus/mail-source.el (mail-source-delete-old-incoming)
(mail-source-callback, mail-source-movemail):
* lisp/gnus/nneething.el (nneething-create-mapping)
(nneething-make-head):
* lisp/gnus/nnfolder.el (nnfolder-read-folder):
* lisp/gnus/nnheader.el (nnheader-file-size)
(nnheader-insert-nov-file):
* lisp/gnus/nnmail.el (nnmail-activate):
* lisp/gnus/nnmaildir.el (nnmaildir--group-maxnum)
(nnmaildir--new-number, nnmaildir--update-nov)
(nnmaildir--scan, nnmaildir-request-scan)
(nnmaildir-request-update-info)
(nnmaildir-request-expire-articles):
* lisp/gnus/nnmh.el (nnmh-request-list-1)
(nnmh-request-expire-articles, nnmh-update-gnus-unreads):
* lisp/gnus/nnml.el (nnml-request-expire-articles):
* lisp/gnus/spam-stat.el (spam-stat-save, spam-stat-load)
(spam-stat-process-directory, spam-stat-test-directory):
* lisp/ido.el (ido-directory-too-big-p)
(ido-file-name-all-completions):
* lisp/image-dired.el (image-dired-get-thumbnail-image)
(image-dired-create-thumb-1):
* lisp/info.el (info-insert-file-contents):
* lisp/ls-lisp.el (ls-lisp-insert-directory)
(ls-lisp-handle-switches, ls-lisp-classify-file)
(ls-lisp-format):
* lisp/mail/blessmail.el:
* lisp/mail/feedmail.el (feedmail-default-date-generator)
(feedmail-default-message-id-generator):
* lisp/mail/mailabbrev.el (mail-abbrevs-sync-aliases)
(mail-abbrevs-setup):
* lisp/mail/mspools.el (mspools-size-folder):
* lisp/mail/rmail.el (rmail-insert-inbox-text):
* lisp/mail/sendmail.el (sendmail-sync-aliases):
* lisp/mh-e/mh-alias.el (mh-alias-tstamp):
* lisp/net/ange-ftp.el (ange-ftp-parse-netrc)
(ange-ftp-write-region, ange-ftp-file-newer-than-file-p)
(ange-ftp-cf1):
* lisp/net/eudcb-mab.el (eudc-mab-query-internal):
* lisp/net/eww.el (eww-read-bookmarks):
* lisp/net/netrc.el (netrc-parse):
* lisp/net/newst-backend.el (newsticker--image-get):
* lisp/nxml/rng-loc.el (rng-get-parsed-schema-locating-file):
* lisp/obsolete/fast-lock.el (fast-lock-save-cache):
* lisp/obsolete/vc-arch.el (vc-arch-state)
(vc-arch-diff3-rej-p):
* lisp/org/ob-eval.el (org-babel--shell-command-on-region):
* lisp/org/org-attach.el (org-attach-commit):
* lisp/org/org-macro.el (org-macro-initialize-templates):
* lisp/org/org.el (org-babel-load-file)
(org-file-newer-than-p):
* lisp/org/ox-html.el (org-html-format-spec):
* lisp/org/ox-publish.el (org-publish-find-date)
(org-publish-cache-ctime-of-src):
* lisp/pcmpl-gnu.el (pcomplete/tar):
* lisp/pcmpl-rpm.el (pcmpl-rpm-packages):
* lisp/play/cookie1.el (cookie-snarf):
* lisp/progmodes/cmacexp.el (c-macro-expansion):
* lisp/ps-bdf.el (bdf-file-mod-time):
* lisp/server.el (server-ensure-safe-dir):
* lisp/simple.el (shell-command-on-region):
* lisp/speedbar.el (speedbar-item-info-file-helper)
(speedbar-check-obj-this-line):
* lisp/thumbs.el (thumbs-cleanup-thumbsdir):
* lisp/time.el (display-time-mail-check-directory)
(display-time-file-nonempty-p):
* lisp/url/url-cache.el (url-is-cached):
* lisp/url/url-file.el (url-file-asynch-callback):
* lisp/vc/diff-mode.el (diff-delete-if-empty):
* lisp/vc/pcvs-info.el (cvs-fileinfo-from-entries):
* lisp/vc/vc-bzr.el (vc-bzr-state-heuristic):
* lisp/vc/vc-cvs.el (vc-cvs-checkout-model)
(vc-cvs-state-heuristic, vc-cvs-merge-news)
(vc-cvs-retrieve-tag, vc-cvs-parse-status, vc-cvs-parse-entry):
* lisp/vc/vc-hg.el (vc-hg--slurp-hgignore-1)
(vc-hg--ignore-patterns-valid-p)
(vc-hg--cached-dirstate-search, vc-hg-state-fast):
* lisp/vc/vc-hooks.el (vc-after-save):
* lisp/vc/vc-rcs.el (vc-rcs-workfile-is-newer):
* lisp/vc/vc-svn.el (vc-svn-merge-news, vc-svn-parse-status):
* lisp/vc/vc.el (vc-checkout, vc-checkin, vc-revert-file):
* lisp/xdg.el (xdg-mime-apps):
Prefer (file-attribute-size A) to (nth 7 A), and similarly
for other file attributes accessors.
* doc/lispref/files.texi (File Attributes):
* doc/lispref/intro.texi (Version Info):
* doc/lispref/os.texi (Idle Timers):
* lisp/erc/erc.el (erc-string-to-emacs-time):
* lisp/files.el (file-attribute-access-time)
(file-attribute-modification-time)
(file-attribute-status-change-time):
* lisp/net/tramp-compat.el:
(tramp-compat-file-attribute-modification-time)
(tramp-compat-file-attribute-size):
* src/buffer.c (syms_of_buffer):
* src/editfns.c (Fget_internal_run_time):
* src/fileio.c (Fvisited_file_modtime)
(Fset_visited_file_modtime):
* src/keyboard.c (Fcurrent_idle_time):
* src/process.c (Fprocess_attributes):
Defer implementation details about timestamp format to the
section that talks about timestamp format, to make it easier
to change the documentation later if timestamp formats are
extended.
* lisp/gnus/gnus-util.el (gnus-file-newer-than):
* lisp/speedbar.el (speedbar-check-obj-this-line):
* lisp/vc/vc-rcs.el (vc-rcs-workfile-is-newer):
Prefer time-less-p to doing it by hand.
* lisp/ls-lisp.el (ls-lisp-format): Inode numbers are no longer conses.
* lisp/vc/vc-bzr.el (vc-bzr-state-heuristic):
Use eql, not eq, to compare integers that might be bignums.
* lisp/org/ox-publish.el (org-publish-cache-ctime-of-src):
Prefer float-time to doing time arithmetic by hand.
2018-09-23 18:30:46 -07:00
|
|
|
|
(eq 0 (file-attribute-size (file-attributes buffer-file-name))))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(delete-file buffer-file-name)))
|
|
|
|
|
|
|
|
|
|
(defun diff-delete-empty-files ()
|
|
|
|
|
"Arrange for empty diff files to be removed."
|
2018-02-18 00:47:00 -05:00
|
|
|
|
(add-hook 'after-save-hook #'diff-delete-if-empty nil t))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
|
|
|
|
|
(defun diff-make-unified ()
|
|
|
|
|
"Turn context diffs into unified diffs if applicable."
|
|
|
|
|
(if (save-excursion
|
|
|
|
|
(goto-char (point-min))
|
2004-05-06 18:41:32 +00:00
|
|
|
|
(and (looking-at diff-hunk-header-re) (eq (char-after) ?*)))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(let ((mod (buffer-modified-p)))
|
|
|
|
|
(unwind-protect
|
|
|
|
|
(diff-context->unified (point-min) (point-max))
|
|
|
|
|
(restore-buffer-modified-p mod)))))
|
1999-10-09 23:52:39 +00:00
|
|
|
|
|
2000-08-16 19:56:10 +00:00
|
|
|
|
;;;
|
|
|
|
|
;;; Misc operations that have proved useful at some point.
|
|
|
|
|
;;;
|
|
|
|
|
|
|
|
|
|
(defun diff-next-complex-hunk ()
|
|
|
|
|
"Jump to the next \"complex\" hunk.
|
|
|
|
|
\"Complex\" is approximated by \"the hunk changes the number of lines\".
|
|
|
|
|
Only works for unified diffs."
|
|
|
|
|
(interactive)
|
|
|
|
|
(while
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(and (re-search-forward diff-hunk-header-re-unified nil t)
|
|
|
|
|
(equal (match-string 2) (match-string 4)))))
|
2000-08-16 19:56:10 +00:00
|
|
|
|
|
2007-01-11 16:52:59 +00:00
|
|
|
|
(defun diff-sanity-check-context-hunk-half (lines)
|
|
|
|
|
(let ((count lines))
|
|
|
|
|
(while
|
|
|
|
|
(cond
|
|
|
|
|
((and (memq (char-after) '(?\s ?! ?+ ?-))
|
|
|
|
|
(memq (char-after (1+ (point))) '(?\s ?\t)))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(cl-decf count) t)
|
2007-01-11 16:52:59 +00:00
|
|
|
|
((or (zerop count) (= count lines)) nil)
|
|
|
|
|
((memq (char-after) '(?! ?+ ?-))
|
|
|
|
|
(if (not (and (eq (char-after (1+ (point))) ?\n)
|
|
|
|
|
(y-or-n-p "Try to auto-fix whitespace loss damage? ")))
|
|
|
|
|
(error "End of hunk ambiguously marked")
|
|
|
|
|
(forward-char 1) (insert " ") (forward-line -1) t))
|
|
|
|
|
((< lines 0)
|
|
|
|
|
(error "End of hunk ambiguously marked"))
|
|
|
|
|
((not (y-or-n-p "Try to auto-fix whitespace loss and word-wrap damage? "))
|
|
|
|
|
(error "Abort!"))
|
|
|
|
|
((eolp) (insert " ") (forward-line -1) t)
|
|
|
|
|
(t (insert " ") (delete-region (- (point) 2) (- (point) 1)) t))
|
|
|
|
|
(forward-line))))
|
|
|
|
|
|
|
|
|
|
(defun diff-sanity-check-hunk ()
|
|
|
|
|
(let (;; Every modification is protected by a y-or-n-p, so it's probably
|
|
|
|
|
;; OK to override a read-only setting.
|
|
|
|
|
(inhibit-read-only t))
|
|
|
|
|
(save-excursion
|
|
|
|
|
(cond
|
|
|
|
|
((not (looking-at diff-hunk-header-re))
|
|
|
|
|
(error "Not recognizable hunk header"))
|
|
|
|
|
|
|
|
|
|
;; A context diff.
|
|
|
|
|
((eq (char-after) ?*)
|
2007-09-11 07:00:04 +00:00
|
|
|
|
(if (not (looking-at "\\*\\{15\\}\\(?: .*\\)?\n\\*\\*\\* \\([0-9]+\\)\\(?:,\\([0-9]+\\)\\)? \\*\\*\\*\\*"))
|
2007-01-11 16:52:59 +00:00
|
|
|
|
(error "Unrecognized context diff first hunk header format")
|
|
|
|
|
(forward-line 2)
|
|
|
|
|
(diff-sanity-check-context-hunk-half
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(if (match-end 2)
|
2007-09-11 07:00:04 +00:00
|
|
|
|
(1+ (- (string-to-number (match-string 2))
|
|
|
|
|
(string-to-number (match-string 1))))
|
|
|
|
|
1))
|
2008-05-26 17:25:44 +00:00
|
|
|
|
(if (not (looking-at diff-context-mid-hunk-header-re))
|
2007-01-11 16:52:59 +00:00
|
|
|
|
(error "Unrecognized context diff second hunk header format")
|
|
|
|
|
(forward-line)
|
|
|
|
|
(diff-sanity-check-context-hunk-half
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(if (match-end 2)
|
2007-09-11 07:00:04 +00:00
|
|
|
|
(1+ (- (string-to-number (match-string 2))
|
|
|
|
|
(string-to-number (match-string 1))))
|
|
|
|
|
1)))))
|
2007-01-11 16:52:59 +00:00
|
|
|
|
|
|
|
|
|
;; A unified diff.
|
|
|
|
|
((eq (char-after) ?@)
|
2008-02-25 03:54:54 +00:00
|
|
|
|
(if (not (looking-at diff-hunk-header-re-unified))
|
2007-01-11 16:52:59 +00:00
|
|
|
|
(error "Unrecognized unified diff hunk header format")
|
2008-04-25 02:08:43 +00:00
|
|
|
|
(let ((before (string-to-number (or (match-string 2) "1")))
|
|
|
|
|
(after (string-to-number (or (match-string 4) "1"))))
|
2007-01-11 16:52:59 +00:00
|
|
|
|
(forward-line)
|
|
|
|
|
(while
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(pcase (char-after)
|
|
|
|
|
(?\s (cl-decf before) (cl-decf after) t)
|
2007-09-12 05:11:07 +00:00
|
|
|
|
(?-
|
2017-01-30 21:43:32 -08:00
|
|
|
|
(cond
|
|
|
|
|
((and (looking-at diff-separator-re)
|
|
|
|
|
(zerop before) (zerop after))
|
|
|
|
|
nil)
|
|
|
|
|
((and (looking-at diff-file-header-re)
|
|
|
|
|
(zerop before) (zerop after))
|
|
|
|
|
;; No need to query: this is a case where two patches
|
|
|
|
|
;; are concatenated and only counting the lines will
|
|
|
|
|
;; give the right result. Let's just add an empty
|
|
|
|
|
;; line so that our code which doesn't count lines
|
|
|
|
|
;; will not get confused.
|
|
|
|
|
(save-excursion (insert "\n")) nil)
|
|
|
|
|
(t
|
|
|
|
|
(cl-decf before) t)))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(?+ (cl-decf after) t)
|
|
|
|
|
(_
|
2007-01-11 16:52:59 +00:00
|
|
|
|
(cond
|
2008-02-25 03:54:54 +00:00
|
|
|
|
((and diff-valid-unified-empty-line
|
|
|
|
|
;; Not just (eolp) so we don't infloop at eob.
|
2008-02-29 02:40:10 +00:00
|
|
|
|
(eq (char-after) ?\n)
|
|
|
|
|
(> before 0) (> after 0))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(cl-decf before) (cl-decf after) t)
|
2007-01-11 16:52:59 +00:00
|
|
|
|
((and (zerop before) (zerop after)) nil)
|
|
|
|
|
((or (< before 0) (< after 0))
|
|
|
|
|
(error (if (or (zerop before) (zerop after))
|
|
|
|
|
"End of hunk ambiguously marked"
|
|
|
|
|
"Hunk seriously messed up")))
|
2008-02-25 03:54:54 +00:00
|
|
|
|
((not (y-or-n-p (concat "Try to auto-fix " (if (eolp) "whitespace loss" "word-wrap damage") "? ")))
|
2007-01-11 16:52:59 +00:00
|
|
|
|
(error "Abort!"))
|
|
|
|
|
((eolp) (insert " ") (forward-line -1) t)
|
|
|
|
|
(t (insert " ")
|
|
|
|
|
(delete-region (- (point) 2) (- (point) 1)) t))))
|
|
|
|
|
(forward-line)))))
|
|
|
|
|
|
|
|
|
|
;; A plain diff.
|
|
|
|
|
(t
|
|
|
|
|
;; TODO.
|
|
|
|
|
)))))
|
|
|
|
|
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(defun diff-hunk-text (hunk destp char-offset)
|
|
|
|
|
"Return the literal source text from HUNK as (TEXT . OFFSET).
|
2006-05-09 23:06:14 +00:00
|
|
|
|
If DESTP is nil, TEXT is the source, otherwise the destination text.
|
2001-11-26 00:20:41 +00:00
|
|
|
|
CHAR-OFFSET is a char-offset in HUNK, and OFFSET is the corresponding
|
|
|
|
|
char-offset in TEXT."
|
2000-09-12 11:24:28 +00:00
|
|
|
|
(with-temp-buffer
|
2000-09-21 16:52:30 +00:00
|
|
|
|
(insert hunk)
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(let ((src-pos nil)
|
|
|
|
|
(dst-pos nil)
|
|
|
|
|
(divider-pos nil)
|
|
|
|
|
(num-pfx-chars 2))
|
|
|
|
|
;; Set the following variables:
|
|
|
|
|
;; SRC-POS buffer pos of the source part of the hunk or nil if none
|
|
|
|
|
;; DST-POS buffer pos of the destination part of the hunk or nil
|
|
|
|
|
;; DIVIDER-POS buffer pos of any divider line separating the src & dst
|
|
|
|
|
;; NUM-PFX-CHARS number of line-prefix characters used by this format"
|
|
|
|
|
(cond ((looking-at "^@@")
|
|
|
|
|
;; unified diff
|
|
|
|
|
(setq num-pfx-chars 1)
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(setq src-pos (point) dst-pos (point)))
|
|
|
|
|
((looking-at "^\\*\\*")
|
|
|
|
|
;; context diff
|
|
|
|
|
(forward-line 2)
|
|
|
|
|
(setq src-pos (point))
|
2008-05-26 17:25:44 +00:00
|
|
|
|
(re-search-forward diff-context-mid-hunk-header-re nil t)
|
2000-09-21 16:52:30 +00:00
|
|
|
|
(forward-line 0)
|
|
|
|
|
(setq divider-pos (point))
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(setq dst-pos (point)))
|
|
|
|
|
((looking-at "^[0-9]+a[0-9,]+$")
|
|
|
|
|
;; normal diff, insert
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(setq dst-pos (point)))
|
|
|
|
|
((looking-at "^[0-9,]+d[0-9]+$")
|
|
|
|
|
;; normal diff, delete
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(setq src-pos (point)))
|
|
|
|
|
((looking-at "^[0-9,]+c[0-9,]+$")
|
|
|
|
|
;; normal diff, change
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(setq src-pos (point))
|
|
|
|
|
(re-search-forward "^---$" nil t)
|
|
|
|
|
(forward-line 0)
|
|
|
|
|
(setq divider-pos (point))
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(setq dst-pos (point)))
|
|
|
|
|
(t
|
|
|
|
|
(error "Unknown diff hunk type")))
|
|
|
|
|
|
|
|
|
|
(if (if destp (null dst-pos) (null src-pos))
|
|
|
|
|
;; Implied empty text
|
|
|
|
|
(if char-offset '("" . 0) "")
|
|
|
|
|
|
|
|
|
|
;; For context diffs, either side can be empty, (if there's only
|
|
|
|
|
;; added or only removed text). We should then use the other side.
|
|
|
|
|
(cond ((equal src-pos divider-pos) (setq src-pos dst-pos))
|
|
|
|
|
((equal dst-pos (point-max)) (setq dst-pos src-pos)))
|
|
|
|
|
|
|
|
|
|
(when char-offset (goto-char (+ (point-min) char-offset)))
|
|
|
|
|
|
|
|
|
|
;; Get rid of anything except the desired text.
|
|
|
|
|
(save-excursion
|
|
|
|
|
;; Delete unused text region
|
|
|
|
|
(let ((keep (if destp dst-pos src-pos)))
|
|
|
|
|
(when (and divider-pos (> divider-pos keep))
|
|
|
|
|
(delete-region divider-pos (point-max)))
|
|
|
|
|
(delete-region (point-min) keep))
|
|
|
|
|
;; Remove line-prefix characters, and unneeded lines (unified diffs).
|
2018-12-19 00:55:15 +02:00
|
|
|
|
;; Also skip lines like "\ No newline at end of file"
|
2021-05-27 01:19:36 +03:00
|
|
|
|
(let ((kill-chars (list (if destp ?- ?+) ?\\))
|
|
|
|
|
curr-char last-char)
|
2000-09-21 16:52:30 +00:00
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(while (not (eobp))
|
2021-05-27 01:19:36 +03:00
|
|
|
|
(setq curr-char (char-after))
|
|
|
|
|
(if (memq curr-char kill-chars)
|
2021-05-20 21:23:01 +03:00
|
|
|
|
(delete-region
|
|
|
|
|
;; Check for "\ No newline at end of file"
|
2021-05-27 01:19:36 +03:00
|
|
|
|
(if (and (eq curr-char ?\\)
|
|
|
|
|
(not (eq last-char (if destp ?- ?+)))
|
2021-05-20 21:23:01 +03:00
|
|
|
|
(save-excursion
|
2021-05-27 01:19:36 +03:00
|
|
|
|
(forward-line 1)
|
|
|
|
|
(or (eobp) (and (eq last-char ?-)
|
|
|
|
|
(eq (char-after) ?+)))))
|
|
|
|
|
(max (1- (point)) (point-min))
|
2021-05-20 21:23:01 +03:00
|
|
|
|
(point))
|
|
|
|
|
(progn (forward-line 1) (point)))
|
2000-09-21 16:52:30 +00:00
|
|
|
|
(delete-char num-pfx-chars)
|
2021-05-27 01:19:36 +03:00
|
|
|
|
(forward-line 1))
|
|
|
|
|
(setq last-char curr-char))))
|
2000-09-21 16:52:30 +00:00
|
|
|
|
|
|
|
|
|
(let ((text (buffer-substring-no-properties (point-min) (point-max))))
|
|
|
|
|
(if char-offset (cons text (- (point) (point-min))) text))))))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
|
2000-09-11 13:51:21 +00:00
|
|
|
|
|
2000-09-19 16:24:30 +00:00
|
|
|
|
(defun diff-find-text (text)
|
2001-11-26 00:20:41 +00:00
|
|
|
|
"Return the buffer position (BEG . END) of the nearest occurrence of TEXT.
|
2000-09-11 13:51:21 +00:00
|
|
|
|
If TEXT isn't found, nil is returned."
|
|
|
|
|
(let* ((orig (point))
|
|
|
|
|
(forw (and (search-forward text nil t)
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(cons (match-beginning 0) (match-end 0))))
|
2000-09-11 13:51:21 +00:00
|
|
|
|
(back (and (goto-char (+ orig (length text)))
|
|
|
|
|
(search-backward text nil t)
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(cons (match-beginning 0) (match-end 0)))))
|
|
|
|
|
;; Choose the closest match.
|
|
|
|
|
(if (and forw back)
|
|
|
|
|
(if (> (- (car forw) orig) (- orig (car back))) back forw)
|
|
|
|
|
(or back forw))))
|
|
|
|
|
|
|
|
|
|
(defun diff-find-approx-text (text)
|
|
|
|
|
"Return the buffer position (BEG . END) of the nearest occurrence of TEXT.
|
|
|
|
|
Whitespace differences are ignored."
|
|
|
|
|
(let* ((orig (point))
|
|
|
|
|
(re (concat "^[ \t\n]*"
|
2018-02-18 00:47:00 -05:00
|
|
|
|
(mapconcat #'regexp-quote (split-string text) "[ \t\n]+")
|
2001-11-26 00:20:41 +00:00
|
|
|
|
"[ \t\n]*\n"))
|
|
|
|
|
(forw (and (re-search-forward re nil t)
|
|
|
|
|
(cons (match-beginning 0) (match-end 0))))
|
|
|
|
|
(back (and (goto-char (+ orig (length text)))
|
|
|
|
|
(re-search-backward re nil t)
|
|
|
|
|
(cons (match-beginning 0) (match-end 0)))))
|
|
|
|
|
;; Choose the closest match.
|
2000-09-11 13:51:21 +00:00
|
|
|
|
(if (and forw back)
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(if (> (- (car forw) orig) (- orig (car back))) back forw)
|
2000-09-11 13:51:21 +00:00
|
|
|
|
(or back forw))))
|
|
|
|
|
|
2021-02-26 16:51:15 -05:00
|
|
|
|
(define-obsolete-function-alias 'diff-xor #'xor "27.1")
|
2000-09-21 16:15:32 +00:00
|
|
|
|
|
2008-09-14 21:16:30 +00:00
|
|
|
|
(defun diff-find-source-location (&optional other-file reverse noprompt)
|
2019-07-04 20:32:39 -04:00
|
|
|
|
"Find current diff location within the source file.
|
|
|
|
|
OTHER-FILE, if non-nil, means to look at the diff's name and line
|
|
|
|
|
numbers for the old file. Furthermore, use `diff-vc-revisions'
|
|
|
|
|
if it's available. If `diff-jump-to-old-file' is non-nil, the
|
|
|
|
|
sense of this parameter is reversed. If the prefix argument is
|
|
|
|
|
8 or more, `diff-jump-to-old-file' is set to OTHER-FILE.
|
|
|
|
|
REVERSE, if non-nil, switches the sense of SRC and DST (see below).
|
|
|
|
|
NOPROMPT, if non-nil, means not to prompt the user.
|
|
|
|
|
Return a list (BUF LINE-OFFSET (BEG . END) SRC DST SWITCHED).
|
2001-11-26 00:20:41 +00:00
|
|
|
|
BUF is the buffer corresponding to the source file.
|
|
|
|
|
LINE-OFFSET is the offset between the expected and actual positions
|
|
|
|
|
of the text of the hunk or nil if the text was not found.
|
2019-07-04 20:32:39 -04:00
|
|
|
|
\(BEG . END) is a pair indicating the position of the text in the buffer.
|
2001-11-26 00:20:41 +00:00
|
|
|
|
SRC and DST are the two variants of text as returned by `diff-hunk-text'.
|
|
|
|
|
SRC is the variant that was found in the buffer.
|
2019-07-04 20:32:39 -04:00
|
|
|
|
SWITCHED is non-nil if the patch is already applied."
|
2000-09-19 16:25:43 +00:00
|
|
|
|
(save-excursion
|
2019-07-31 19:45:06 +02:00
|
|
|
|
(let* ((other (xor other-file diff-jump-to-old-file))
|
2017-01-21 11:54:38 +09:00
|
|
|
|
(char-offset (- (point) (diff-beginning-of-hunk t)))
|
2007-01-11 16:52:59 +00:00
|
|
|
|
;; Check that the hunk is well-formed. Otherwise diff-mode and
|
|
|
|
|
;; the user may disagree on what constitutes the hunk
|
|
|
|
|
;; (e.g. because an empty line truncates the hunk mid-course),
|
|
|
|
|
;; leading to potentially nasty surprises for the user.
|
2009-04-21 06:56:51 +00:00
|
|
|
|
;;
|
2009-04-21 07:19:01 +00:00
|
|
|
|
;; Suppress check when NOPROMPT is non-nil (Bug#3033).
|
2009-04-21 06:56:51 +00:00
|
|
|
|
(_ (unless noprompt (diff-sanity-check-hunk)))
|
2008-09-14 21:16:30 +00:00
|
|
|
|
(hunk (buffer-substring
|
2017-01-21 11:54:38 +09:00
|
|
|
|
(point) (save-excursion (diff-end-of-hunk) (point))))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
(old (diff-hunk-text hunk reverse char-offset))
|
|
|
|
|
(new (diff-hunk-text hunk (not reverse) char-offset))
|
2000-09-19 16:25:43 +00:00
|
|
|
|
;; Find the location specification.
|
2000-09-20 16:56:13 +00:00
|
|
|
|
(line (if (not (looking-at "\\(?:\\*\\{15\\}.*\n\\)?[-@* ]*\\([0-9,]+\\)\\([ acd+]+\\([0-9,]+\\)\\)?"))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
(error "Can't find the hunk header")
|
|
|
|
|
(if other (match-string 1)
|
|
|
|
|
(if (match-end 3) (match-string 3)
|
2008-05-26 17:25:44 +00:00
|
|
|
|
(unless (re-search-forward
|
|
|
|
|
diff-context-mid-hunk-header-re nil t)
|
2000-09-21 16:15:32 +00:00
|
|
|
|
(error "Can't find the hunk separator"))
|
|
|
|
|
(match-string 1)))))
|
2008-09-14 21:16:30 +00:00
|
|
|
|
(file (or (diff-find-file-name other noprompt)
|
|
|
|
|
(error "Can't find the file")))
|
2018-11-14 02:14:52 +02:00
|
|
|
|
(revision (and other diff-vc-backend
|
2018-11-17 23:52:05 +02:00
|
|
|
|
(if reverse (nth 1 diff-vc-revisions)
|
|
|
|
|
(or (nth 0 diff-vc-revisions)
|
|
|
|
|
;; When diff shows changes in working revision
|
|
|
|
|
(vc-working-revision file)))))
|
2018-11-14 02:14:52 +02:00
|
|
|
|
(buf (if revision
|
2018-11-14 02:23:04 +02:00
|
|
|
|
(let ((vc-find-revision-no-save t))
|
2018-12-19 01:10:09 +02:00
|
|
|
|
(vc-find-revision (expand-file-name file) revision diff-vc-backend))
|
2020-10-17 10:29:15 +02:00
|
|
|
|
;; NOPROMPT is only non-nil when called from
|
|
|
|
|
;; `which-function-mode', so avoid "File x changed
|
|
|
|
|
;; on disk. Reread from disk?" warnings.
|
|
|
|
|
(find-file-noselect file noprompt))))
|
2000-09-19 16:25:43 +00:00
|
|
|
|
;; Update the user preference if he so wished.
|
|
|
|
|
(when (> (prefix-numeric-value other-file) 8)
|
2001-05-21 18:45:05 +00:00
|
|
|
|
(setq diff-jump-to-old-file other))
|
2000-09-20 16:56:13 +00:00
|
|
|
|
(with-current-buffer buf
|
2009-08-24 17:11:20 +00:00
|
|
|
|
(goto-char (point-min)) (forward-line (1- (string-to-number line)))
|
2000-09-20 16:56:13 +00:00
|
|
|
|
(let* ((orig-pos (point))
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(switched nil)
|
2004-03-23 20:50:36 +00:00
|
|
|
|
;; FIXME: Check for case where both OLD and NEW are found.
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(pos (or (diff-find-text (car old))
|
|
|
|
|
(progn (setq switched t) (diff-find-text (car new)))
|
|
|
|
|
(progn (setq switched nil)
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(condition-case nil
|
|
|
|
|
(diff-find-approx-text (car old))
|
|
|
|
|
(invalid-regexp nil))) ;Regex too big.
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(progn (setq switched t)
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(condition-case nil
|
|
|
|
|
(diff-find-approx-text (car new))
|
|
|
|
|
(invalid-regexp nil))) ;Regex too big.
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(progn (setq switched nil) nil))))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
(nconc
|
|
|
|
|
(list buf)
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(if pos
|
|
|
|
|
(list (count-lines orig-pos (car pos)) pos)
|
|
|
|
|
(list nil (cons orig-pos (+ orig-pos (length (car old))))))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
(if switched (list new old t) (list old new))))))))
|
|
|
|
|
|
2000-09-19 16:25:43 +00:00
|
|
|
|
|
2000-09-21 16:15:32 +00:00
|
|
|
|
(defun diff-hunk-status-msg (line-offset reversed dry-run)
|
|
|
|
|
(let ((msg (if dry-run
|
|
|
|
|
(if reversed "already applied" "not yet applied")
|
|
|
|
|
(if reversed "undone" "applied"))))
|
|
|
|
|
(message (cond ((null line-offset) "Hunk text not found")
|
|
|
|
|
((= line-offset 0) "Hunk %s")
|
|
|
|
|
((= line-offset 1) "Hunk %s at offset %d line")
|
|
|
|
|
(t "Hunk %s at offset %d lines"))
|
|
|
|
|
msg line-offset)))
|
|
|
|
|
|
2006-09-11 18:11:19 +00:00
|
|
|
|
(defvar diff-apply-hunk-to-backup-file nil)
|
2000-09-21 16:15:32 +00:00
|
|
|
|
|
|
|
|
|
(defun diff-apply-hunk (&optional reverse)
|
2000-09-21 16:52:30 +00:00
|
|
|
|
"Apply the current hunk to the source file and go to the next.
|
2000-09-11 13:51:21 +00:00
|
|
|
|
By default, the new source file is patched, but if the variable
|
2001-05-21 18:45:05 +00:00
|
|
|
|
`diff-jump-to-old-file' is non-nil, then the old source file is
|
2000-09-11 13:51:21 +00:00
|
|
|
|
patched instead (some commands, such as `diff-goto-source' can change
|
|
|
|
|
the value of this variable when given an appropriate prefix argument).
|
|
|
|
|
|
2000-10-02 06:50:45 +00:00
|
|
|
|
With a prefix argument, REVERSE the hunk."
|
2000-09-21 16:15:32 +00:00
|
|
|
|
(interactive "P")
|
2017-01-21 11:54:55 +09:00
|
|
|
|
(diff-beginning-of-hunk t)
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(pcase-let ((`(,buf ,line-offset ,pos ,old ,new ,switched)
|
|
|
|
|
;; Sometimes we'd like to have the following behavior: if
|
|
|
|
|
;; REVERSE go to the new file, otherwise go to the old.
|
|
|
|
|
;; But that means that by default we use the old file, which is
|
|
|
|
|
;; the opposite of the default for diff-goto-source, and is thus
|
|
|
|
|
;; confusing. Also when you don't know about it it's
|
|
|
|
|
;; pretty surprising.
|
|
|
|
|
;; TODO: make it possible to ask explicitly for this behavior.
|
|
|
|
|
;;
|
|
|
|
|
;; This is duplicated in diff-test-hunk.
|
|
|
|
|
(diff-find-source-location nil reverse)))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
(cond
|
2000-10-02 06:50:45 +00:00
|
|
|
|
((null line-offset)
|
|
|
|
|
(error "Can't find the text to patch"))
|
2006-09-11 18:11:19 +00:00
|
|
|
|
((with-current-buffer buf
|
|
|
|
|
(and buffer-file-name
|
|
|
|
|
(backup-file-name-p buffer-file-name)
|
|
|
|
|
(not diff-apply-hunk-to-backup-file)
|
Prefer setq-local in vc/*.el
* lisp/vc/add-log.el (find-change-log, change-log-mode):
* lisp/vc/cvs-status.el (cvs-status-mode):
* lisp/vc/diff-mode.el (diff-restrict-view, diff-find-file-name):
(diff-mode, diff-setup-whitespace, diff-apply-hunk):
* lisp/vc/diff.el (diff-no-select):
* lisp/vc/ediff-util.el (ediff-setup):
* lisp/vc/log-edit.el (log-edit, log-edit-mode):
* lisp/vc/log-view.el (log-view-mode):
* lisp/vc/pcvs.el (cvs-temp-buffer, cvs-make-cvs-buffer):
(cvs-update-filter, cvs-mode, cvs-mode-commit)
(cvs-mode-edit-log, cvs-vc-command-advice):
* lisp/vc/smerge-mode.el (smerge-match-conflict):
(smerge-ediff, smerge-mode):
* lisp/vc/vc-annotate.el (vc-annotate-mode):
(vc-annotate, vc-annotate-display):
* lisp/vc/vc-bzr.el (vc-bzr-log-view-mode):
* lisp/vc/vc-dir.el (vc-dir-mode):
* lisp/vc/vc-dispatcher.el (vc-setup-buffer):
(vc-compilation-mode, vc-start-logentry):
* lisp/vc/vc-git.el (vc-git-log-view-mode):
* lisp/vc/vc-hg.el (vc-hg-log-view-mode):
* lisp/vc/vc-hooks.el (vc-refresh-state):
* lisp/vc/vc-mtn.el (vc-mtn-log-view-mode):
* lisp/vc/vc-svn.el (vc-svn-log-view-mode):
* lisp/vc/vc.el (vc-register, vc-diff-internal):
(vc-find-revision-save, vc-find-revision-no-save):
(vc-log-internal-common, vc-region-history): Prefer setq-local.
2020-12-05 08:58:12 +01:00
|
|
|
|
(not (setq-local diff-apply-hunk-to-backup-file
|
|
|
|
|
(yes-or-no-p (format "Really apply this hunk to %s? "
|
|
|
|
|
(file-name-nondirectory
|
|
|
|
|
buffer-file-name)))))))
|
2007-03-11 10:45:00 +00:00
|
|
|
|
(error "%s"
|
|
|
|
|
(substitute-command-keys
|
2006-09-11 18:11:19 +00:00
|
|
|
|
(format "Use %s\\[diff-apply-hunk] to apply it to the other file"
|
|
|
|
|
(if (not reverse) "\\[universal-argument] ")))))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
((and switched
|
2001-01-24 23:26:40 +00:00
|
|
|
|
;; A reversed patch was detected, perhaps apply it in reverse.
|
2000-09-21 16:15:32 +00:00
|
|
|
|
(not (save-window-excursion
|
|
|
|
|
(pop-to-buffer buf)
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(goto-char (+ (car pos) (cdr old)))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
(y-or-n-p
|
|
|
|
|
(if reverse
|
|
|
|
|
"Hunk hasn't been applied yet; apply it now? "
|
|
|
|
|
"Hunk has already been applied; undo it? ")))))
|
2000-10-02 06:50:45 +00:00
|
|
|
|
(message "(Nothing done)"))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
(t
|
2000-10-02 06:50:45 +00:00
|
|
|
|
;; Apply the hunk
|
|
|
|
|
(with-current-buffer buf
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(goto-char (car pos))
|
|
|
|
|
(delete-region (car pos) (cdr pos))
|
2000-10-02 06:50:45 +00:00
|
|
|
|
(insert (car new)))
|
|
|
|
|
;; Display BUF in a window
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(set-window-point (display-buffer buf) (+ (car pos) (cdr new)))
|
2019-07-31 19:45:06 +02:00
|
|
|
|
(diff-hunk-status-msg line-offset (xor switched reverse) nil)
|
2000-10-02 06:50:45 +00:00
|
|
|
|
(when diff-advance-after-apply-hunk
|
2017-01-21 11:54:38 +09:00
|
|
|
|
(diff-hunk-next))))))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
|
2000-09-11 13:51:21 +00:00
|
|
|
|
|
|
|
|
|
(defun diff-test-hunk (&optional reverse)
|
|
|
|
|
"See whether it's possible to apply the current hunk.
|
2000-10-02 06:50:45 +00:00
|
|
|
|
With a prefix argument, try to REVERSE the hunk."
|
2000-09-11 13:51:21 +00:00
|
|
|
|
(interactive "P")
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(pcase-let ((`(,buf ,line-offset ,pos ,src ,_dst ,switched)
|
|
|
|
|
(diff-find-source-location nil reverse)))
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(set-window-point (display-buffer buf) (+ (car pos) (cdr src)))
|
2019-07-31 19:45:06 +02:00
|
|
|
|
(diff-hunk-status-msg line-offset (xor reverse switched) t)))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
|
2000-09-11 13:51:21 +00:00
|
|
|
|
|
2014-12-01 13:12:37 -05:00
|
|
|
|
(defun diff-kill-applied-hunks ()
|
|
|
|
|
"Kill all hunks that have already been applied starting at point."
|
|
|
|
|
(interactive)
|
|
|
|
|
(while (not (eobp))
|
2015-11-14 03:03:58 +02:00
|
|
|
|
(pcase-let ((`(,_buf ,line-offset ,_pos ,_src ,_dst ,switched)
|
2014-12-01 13:12:37 -05:00
|
|
|
|
(diff-find-source-location nil nil)))
|
|
|
|
|
(if (and line-offset switched)
|
|
|
|
|
(diff-hunk-kill)
|
|
|
|
|
(diff-hunk-next)))))
|
|
|
|
|
|
2021-02-26 16:51:15 -05:00
|
|
|
|
(defalias 'diff-mouse-goto-source #'diff-goto-source)
|
2004-04-14 17:31:42 +00:00
|
|
|
|
|
|
|
|
|
(defun diff-goto-source (&optional other-file event)
|
2000-09-11 13:51:21 +00:00
|
|
|
|
"Jump to the corresponding source line.
|
2001-05-21 18:45:05 +00:00
|
|
|
|
`diff-jump-to-old-file' (or its opposite if the OTHER-FILE prefix arg
|
2000-09-20 22:37:10 +00:00
|
|
|
|
is given) determines whether to jump to the old or the new file.
|
2000-09-11 13:51:21 +00:00
|
|
|
|
If the prefix arg is bigger than 8 (for example with \\[universal-argument] \\[universal-argument])
|
2018-11-14 02:14:52 +02:00
|
|
|
|
then `diff-jump-to-old-file' is also set, for the next invocations.
|
|
|
|
|
|
|
|
|
|
Under version control, the OTHER-FILE prefix arg means jump to the old
|
|
|
|
|
revision of the file if point is on an old changed line, or to the new
|
|
|
|
|
revision of the file otherwise."
|
2004-04-14 17:31:42 +00:00
|
|
|
|
(interactive (list current-prefix-arg last-input-event))
|
2000-10-03 18:36:36 +00:00
|
|
|
|
;; When pointing at a removal line, we probably want to jump to
|
|
|
|
|
;; the old location, and else to the new (i.e. as if reverting).
|
|
|
|
|
;; This is a convenient detail when using smerge-diff.
|
2004-04-14 17:31:42 +00:00
|
|
|
|
(if event (posn-set-point (event-end event)))
|
2018-04-17 22:27:48 +03:00
|
|
|
|
(let ((buffer (when event (current-buffer)))
|
2018-11-17 23:52:05 +02:00
|
|
|
|
(reverse (not (save-excursion (beginning-of-line) (looking-at "[-<]")))))
|
2021-03-01 15:35:51 -05:00
|
|
|
|
(pcase-let ((`(,buf ,_line-offset ,pos ,src ,_dst ,_switched)
|
2018-11-17 23:52:05 +02:00
|
|
|
|
(diff-find-source-location other-file reverse)))
|
2000-10-03 18:36:36 +00:00
|
|
|
|
(pop-to-buffer buf)
|
2001-11-26 00:20:41 +00:00
|
|
|
|
(goto-char (+ (car pos) (cdr src)))
|
2020-08-20 16:52:57 +02:00
|
|
|
|
(when buffer (next-error-found buffer (current-buffer))))))
|
2000-09-21 16:15:32 +00:00
|
|
|
|
|
2000-09-11 13:51:21 +00:00
|
|
|
|
|
2000-09-20 22:37:10 +00:00
|
|
|
|
(defun diff-current-defun ()
|
2000-09-21 16:15:32 +00:00
|
|
|
|
"Find the name of function at point.
|
|
|
|
|
For use in `add-log-current-defun-function'."
|
2007-10-12 19:36:28 +00:00
|
|
|
|
;; Kill change-log-default-name so it gets recomputed each time, since
|
|
|
|
|
;; each hunk may belong to another file which may belong to another
|
|
|
|
|
;; directory and hence have a different ChangeLog file.
|
|
|
|
|
(kill-local-variable 'change-log-default-name)
|
2004-06-13 16:49:55 +00:00
|
|
|
|
(save-excursion
|
|
|
|
|
(when (looking-at diff-hunk-header-re)
|
|
|
|
|
(forward-line 1)
|
2004-10-10 04:08:43 +00:00
|
|
|
|
(re-search-forward "^[^ ]" nil t))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(pcase-let ((`(,buf ,_line-offset ,pos ,src ,dst ,switched)
|
|
|
|
|
(ignore-errors ;Signals errors in place of prompting.
|
|
|
|
|
;; Use `noprompt' since this is used in which-func-mode
|
|
|
|
|
;; and such.
|
|
|
|
|
(diff-find-source-location nil nil 'noprompt))))
|
2008-09-14 21:16:30 +00:00
|
|
|
|
(when buf
|
|
|
|
|
(beginning-of-line)
|
|
|
|
|
(or (when (memq (char-after) '(?< ?-))
|
|
|
|
|
;; Cursor is pointing at removed text. This could be a removed
|
|
|
|
|
;; function, in which case, going to the source buffer will
|
|
|
|
|
;; not help since the function is now removed. Instead,
|
|
|
|
|
;; try to figure out the function name just from the
|
|
|
|
|
;; code-fragment.
|
|
|
|
|
(let ((old (if switched dst src)))
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert (car old))
|
|
|
|
|
(funcall (buffer-local-value 'major-mode buf))
|
|
|
|
|
(goto-char (+ (point-min) (cdr old)))
|
|
|
|
|
(add-log-current-defun))))
|
|
|
|
|
(with-current-buffer buf
|
|
|
|
|
(goto-char (+ (car pos) (cdr src)))
|
|
|
|
|
(add-log-current-defun)))))))
|
2000-08-16 19:56:10 +00:00
|
|
|
|
|
2007-10-20 02:02:22 +00:00
|
|
|
|
(defun diff-ignore-whitespace-hunk ()
|
|
|
|
|
"Re-diff the current hunk, ignoring whitespace differences."
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(interactive)
|
2020-10-30 14:04:06 +01:00
|
|
|
|
(diff-refresh-hunk t))
|
|
|
|
|
|
|
|
|
|
(defun diff-refresh-hunk (&optional ignore-whitespace)
|
|
|
|
|
"Re-diff the current hunk."
|
|
|
|
|
(interactive)
|
2017-01-21 11:54:38 +09:00
|
|
|
|
(let* ((char-offset (- (point) (diff-beginning-of-hunk t)))
|
2020-10-30 14:04:06 +01:00
|
|
|
|
(opt-type (pcase (char-after)
|
|
|
|
|
(?@ "-u")
|
|
|
|
|
(?* "-c")))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(line-nb (and (or (looking-at "[^0-9]+\\([0-9]+\\)")
|
|
|
|
|
(error "Can't find line number"))
|
|
|
|
|
(string-to-number (match-string 1))))
|
2008-03-08 07:56:13 +00:00
|
|
|
|
(inhibit-read-only t)
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(hunk (delete-and-extract-region
|
2017-01-21 11:54:38 +09:00
|
|
|
|
(point) (save-excursion (diff-end-of-hunk) (point))))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(lead (make-string (1- line-nb) ?\n)) ;Line nums start at 1.
|
|
|
|
|
(file1 (make-temp-file "diff1"))
|
|
|
|
|
(file2 (make-temp-file "diff2"))
|
|
|
|
|
(coding-system-for-read buffer-file-coding-system)
|
2020-10-30 14:04:06 +01:00
|
|
|
|
opts old new)
|
|
|
|
|
(when ignore-whitespace
|
|
|
|
|
(setq opts '("-b")))
|
|
|
|
|
(when opt-type
|
|
|
|
|
(setq opts (cons opt-type opts)))
|
|
|
|
|
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(unwind-protect
|
|
|
|
|
(save-excursion
|
|
|
|
|
(setq old (diff-hunk-text hunk nil char-offset))
|
|
|
|
|
(setq new (diff-hunk-text hunk t char-offset))
|
|
|
|
|
(write-region (concat lead (car old)) nil file1 nil 'nomessage)
|
|
|
|
|
(write-region (concat lead (car new)) nil file2 nil 'nomessage)
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(let ((status
|
2021-02-26 16:51:15 -05:00
|
|
|
|
(apply #'call-process
|
2020-10-30 14:04:06 +01:00
|
|
|
|
`(,diff-command nil t nil
|
|
|
|
|
,@opts ,file1 ,file2))))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
(pcase status
|
|
|
|
|
(0 nil) ;Nothing to reformat.
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(1 (goto-char (point-min))
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 07:51:54 -04:00
|
|
|
|
;; Remove the file-header.
|
|
|
|
|
(when (re-search-forward diff-hunk-header-re nil t)
|
|
|
|
|
(delete-region (point-min) (match-beginning 0))))
|
|
|
|
|
(_ (goto-char (point-max))
|
2004-03-23 20:50:36 +00:00
|
|
|
|
(unless (bolp) (insert "\n"))
|
|
|
|
|
(insert hunk)))
|
|
|
|
|
(setq hunk (buffer-string))
|
|
|
|
|
(unless (memq status '(0 1))
|
|
|
|
|
(error "Diff returned: %s" status)))))
|
|
|
|
|
;; Whatever happens, put back some equivalent text: either the new
|
|
|
|
|
;; one or the original one in case some error happened.
|
|
|
|
|
(insert hunk)
|
|
|
|
|
(delete-file file1)
|
|
|
|
|
(delete-file file2))))
|
|
|
|
|
|
2007-10-09 04:12:24 +00:00
|
|
|
|
;;; Fine change highlighting.
|
|
|
|
|
|
2014-06-18 11:33:57 +03:00
|
|
|
|
(defface diff-refine-changed
|
2007-10-20 02:02:22 +00:00
|
|
|
|
'((((class color) (min-colors 88) (background light))
|
2012-05-25 03:55:40 +03:00
|
|
|
|
:background "#ffff55")
|
2007-10-20 02:02:22 +00:00
|
|
|
|
(((class color) (min-colors 88) (background dark))
|
2012-05-25 03:55:40 +03:00
|
|
|
|
:background "#aaaa22")
|
|
|
|
|
(t :inverse-video t))
|
2018-07-10 22:52:21 -04:00
|
|
|
|
"Face used for char-based changes shown by `diff-refine-hunk'.")
|
2007-10-09 04:12:24 +00:00
|
|
|
|
|
2012-05-25 03:55:40 +03:00
|
|
|
|
(defface diff-refine-removed
|
|
|
|
|
'((default
|
Remove some face aliases obsoleted in 22.1
* lisp/faces.el (modeline-inactive, modeline-highlight, modeline-buffer-id):
* lisp/hilit-chg.el (highlight-changes-face, highlight-changes-delete-face):
* lisp/info.el (Info-title-1-face, Info-title-2-face, Info-title-3-face,
Info-title-4-face, info-menu-5):
* lisp/obsolete/old-whitespace.el (whitespace-highlight-face):
* lisp/paren.el (show-paren-match-face, show-paren-mismatch-face):
* lisp/progmodes/make-mode.el (makefile-space-face):
* lisp/textmodes/texinfo.el (texinfo-heading-face): Remove.
(texinfo-font-lock-keywords): Use texinfo-heading face.
* lisp/vc/add-log.el (change-log-date-face, change-log-name-face,
change-log-email-face, change-log-file-face, change-log-list-face,
change-log-conditionals-face, change-log-function-face,
change-log-acknowledgement-face):
* lisp/vc/diff-mode.el (diff-header-face, diff-file-header-face,
diff-index-face, diff-hunk-header-face, diff-removed-face, diff-added-face,
diff-changed-face, diff-function-face, diff-context-face,
diff-nonexistent-face): Remove.
(diff-use-changed-face, diff-font-lock-keywords): Use non-obsolete face
symbols.
(diff-hunk-file-names): Fix comment.
(diff-refine-change): Remove.
(diff-refine-removed, diff-refine-added, diff-refine-hunk): Use
non-obsolete face.
* lisp/vc/log-view.el (log-view-file-face, log-view-message-face): Remove.
(log-view-font-lock-keywords): Use non-obsolete face names.
* lisp/vc/pcvs-info.el (cvs-header-face, cvs-filename-face, cvs-unknown-face,
cvs-handled-face, cvs-need-action-face, cvs-marked-face, cvs-msg-face):
* lisp/wid-edit.el (widget-documentation-face, widget-button-face,
widget-field-face, widget-single-line-field-face, widget-inactive-face,
widget-button-pressed-face):
* lisp/woman.el (woman-italic-face, woman-bold-face, woman-unknown-face,
woman-addition-face): Remove.
2016-06-23 17:13:11 -04:00
|
|
|
|
:inherit diff-refine-changed)
|
2019-05-15 21:00:49 +02:00
|
|
|
|
(((class color) (min-colors 257) (background light))
|
2018-12-27 01:40:05 +02:00
|
|
|
|
:background "#ffcccc")
|
2019-05-15 21:00:49 +02:00
|
|
|
|
(((class color) (min-colors 88) (background light))
|
|
|
|
|
:background "#ffbbbb")
|
2012-05-25 03:55:40 +03:00
|
|
|
|
(((class color) (min-colors 88) (background dark))
|
|
|
|
|
:background "#aa2222"))
|
|
|
|
|
"Face used for removed characters shown by `diff-refine-hunk'."
|
2012-08-15 09:29:11 -07:00
|
|
|
|
:version "24.3")
|
2012-05-25 03:55:40 +03:00
|
|
|
|
|
|
|
|
|
(defface diff-refine-added
|
|
|
|
|
'((default
|
Remove some face aliases obsoleted in 22.1
* lisp/faces.el (modeline-inactive, modeline-highlight, modeline-buffer-id):
* lisp/hilit-chg.el (highlight-changes-face, highlight-changes-delete-face):
* lisp/info.el (Info-title-1-face, Info-title-2-face, Info-title-3-face,
Info-title-4-face, info-menu-5):
* lisp/obsolete/old-whitespace.el (whitespace-highlight-face):
* lisp/paren.el (show-paren-match-face, show-paren-mismatch-face):
* lisp/progmodes/make-mode.el (makefile-space-face):
* lisp/textmodes/texinfo.el (texinfo-heading-face): Remove.
(texinfo-font-lock-keywords): Use texinfo-heading face.
* lisp/vc/add-log.el (change-log-date-face, change-log-name-face,
change-log-email-face, change-log-file-face, change-log-list-face,
change-log-conditionals-face, change-log-function-face,
change-log-acknowledgement-face):
* lisp/vc/diff-mode.el (diff-header-face, diff-file-header-face,
diff-index-face, diff-hunk-header-face, diff-removed-face, diff-added-face,
diff-changed-face, diff-function-face, diff-context-face,
diff-nonexistent-face): Remove.
(diff-use-changed-face, diff-font-lock-keywords): Use non-obsolete face
symbols.
(diff-hunk-file-names): Fix comment.
(diff-refine-change): Remove.
(diff-refine-removed, diff-refine-added, diff-refine-hunk): Use
non-obsolete face.
* lisp/vc/log-view.el (log-view-file-face, log-view-message-face): Remove.
(log-view-font-lock-keywords): Use non-obsolete face names.
* lisp/vc/pcvs-info.el (cvs-header-face, cvs-filename-face, cvs-unknown-face,
cvs-handled-face, cvs-need-action-face, cvs-marked-face, cvs-msg-face):
* lisp/wid-edit.el (widget-documentation-face, widget-button-face,
widget-field-face, widget-single-line-field-face, widget-inactive-face,
widget-button-pressed-face):
* lisp/woman.el (woman-italic-face, woman-bold-face, woman-unknown-face,
woman-addition-face): Remove.
2016-06-23 17:13:11 -04:00
|
|
|
|
:inherit diff-refine-changed)
|
2019-05-15 21:00:49 +02:00
|
|
|
|
(((class color) (min-colors 257) (background light))
|
2018-12-27 01:40:05 +02:00
|
|
|
|
:background "#bbffbb")
|
2019-05-15 21:00:49 +02:00
|
|
|
|
(((class color) (min-colors 88) (background light))
|
|
|
|
|
:background "#aaffaa")
|
2012-05-25 03:55:40 +03:00
|
|
|
|
(((class color) (min-colors 88) (background dark))
|
|
|
|
|
:background "#22aa22"))
|
|
|
|
|
"Face used for added characters shown by `diff-refine-hunk'."
|
2012-08-15 09:29:11 -07:00
|
|
|
|
:version "24.3")
|
2012-05-25 03:55:40 +03:00
|
|
|
|
|
2007-10-20 02:02:22 +00:00
|
|
|
|
(defun diff-refine-preproc ()
|
2007-10-19 17:16:43 +00:00
|
|
|
|
(while (re-search-forward "^[+>]" nil t)
|
|
|
|
|
;; Remove spurious changes due to the fact that one side of the hunk is
|
|
|
|
|
;; marked with leading + or > and the other with leading - or <.
|
|
|
|
|
;; We used to replace all the prefix chars with " " but this only worked
|
|
|
|
|
;; when we did char-based refinement (or when using
|
|
|
|
|
;; smerge-refine-weight-hack) since otherwise, the `forward' motion done
|
|
|
|
|
;; in chopup do not necessarily do the same as the ones in highlight
|
|
|
|
|
;; since the "_" is not treated the same as " ".
|
|
|
|
|
(replace-match (cdr (assq (char-before) '((?+ . "-") (?> . "<"))))))
|
|
|
|
|
)
|
2007-10-09 04:12:24 +00:00
|
|
|
|
|
2017-01-12 23:32:44 -05:00
|
|
|
|
(defun diff--forward-while-leading-char (char bound)
|
|
|
|
|
"Move point until reaching a line not starting with CHAR.
|
|
|
|
|
Return new point, if it was moved."
|
|
|
|
|
(let ((pt nil))
|
|
|
|
|
(while (and (< (point) bound) (eql (following-char) char))
|
|
|
|
|
(forward-line 1)
|
|
|
|
|
(setq pt (point)))
|
|
|
|
|
pt))
|
|
|
|
|
|
2007-10-20 02:02:22 +00:00
|
|
|
|
(defun diff-refine-hunk ()
|
2007-10-09 04:12:24 +00:00
|
|
|
|
"Highlight changes of hunk at point at a finer granularity."
|
|
|
|
|
(interactive)
|
2017-02-02 22:27:33 +09:00
|
|
|
|
(when (diff--some-hunks-p)
|
|
|
|
|
(save-excursion
|
2018-07-10 22:52:21 -04:00
|
|
|
|
(let ((beg (diff-beginning-of-hunk t))
|
|
|
|
|
;; Be careful to start from the hunk header so diff-end-of-hunk
|
|
|
|
|
;; gets to read the hunk header's line info.
|
|
|
|
|
(end (progn (diff-end-of-hunk) (point))))
|
|
|
|
|
(diff--refine-hunk beg end)))))
|
|
|
|
|
|
|
|
|
|
(defun diff--refine-hunk (start end)
|
|
|
|
|
(require 'smerge-mode)
|
|
|
|
|
(goto-char start)
|
|
|
|
|
(let* ((style (diff-hunk-style)) ;Skips the hunk header as well.
|
|
|
|
|
(beg (point))
|
|
|
|
|
(props-c '((diff-mode . fine) (face . diff-refine-changed)))
|
|
|
|
|
(props-r '((diff-mode . fine) (face . diff-refine-removed)))
|
|
|
|
|
(props-a '((diff-mode . fine) (face . diff-refine-added))))
|
|
|
|
|
|
|
|
|
|
(remove-overlays beg end 'diff-mode 'fine)
|
|
|
|
|
|
|
|
|
|
(goto-char beg)
|
|
|
|
|
(pcase style
|
2018-11-05 01:22:15 +01:00
|
|
|
|
('unified
|
2018-07-10 22:52:21 -04:00
|
|
|
|
(while (re-search-forward "^-" end t)
|
|
|
|
|
(let ((beg-del (progn (beginning-of-line) (point)))
|
|
|
|
|
beg-add end-add)
|
|
|
|
|
(when (and (diff--forward-while-leading-char ?- end)
|
|
|
|
|
;; Allow for "\ No newline at end of file".
|
|
|
|
|
(progn (diff--forward-while-leading-char ?\\ end)
|
|
|
|
|
(setq beg-add (point)))
|
|
|
|
|
(diff--forward-while-leading-char ?+ end)
|
|
|
|
|
(progn (diff--forward-while-leading-char ?\\ end)
|
|
|
|
|
(setq end-add (point))))
|
|
|
|
|
(smerge-refine-regions beg-del beg-add beg-add end-add
|
|
|
|
|
nil #'diff-refine-preproc props-r props-a)))))
|
2018-11-05 01:22:15 +01:00
|
|
|
|
('context
|
2020-09-13 17:25:08 +02:00
|
|
|
|
(let* ((middle (save-excursion (re-search-forward "^---" end t)))
|
2018-07-10 22:52:21 -04:00
|
|
|
|
(other middle))
|
2020-09-13 17:25:08 +02:00
|
|
|
|
(while (and middle
|
|
|
|
|
(re-search-forward "^\\(?:!.*\n\\)+" middle t))
|
2018-07-10 22:52:21 -04:00
|
|
|
|
(smerge-refine-regions (match-beginning 0) (match-end 0)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char other)
|
|
|
|
|
(re-search-forward "^\\(?:!.*\n\\)+" end)
|
|
|
|
|
(setq other (match-end 0))
|
|
|
|
|
(match-beginning 0))
|
|
|
|
|
other
|
|
|
|
|
(if diff-use-changed-face props-c)
|
|
|
|
|
#'diff-refine-preproc
|
|
|
|
|
(unless diff-use-changed-face props-r)
|
|
|
|
|
(unless diff-use-changed-face props-a)))))
|
|
|
|
|
(_ ;; Normal diffs.
|
|
|
|
|
(let ((beg1 (1+ (point))))
|
|
|
|
|
(when (re-search-forward "^---.*\n" end t)
|
|
|
|
|
;; It's a combined add&remove, so there's something to do.
|
|
|
|
|
(smerge-refine-regions beg1 (match-beginning 0)
|
|
|
|
|
(match-end 0) end
|
|
|
|
|
nil #'diff-refine-preproc props-r props-a)))))))
|
|
|
|
|
|
2019-02-21 12:09:03 -05:00
|
|
|
|
(defun diff--iterate-hunks (max fun)
|
|
|
|
|
"Iterate over all hunks between point and MAX.
|
|
|
|
|
Call FUN with two args (BEG and END) for each hunk."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(let* ((beg (or (ignore-errors (diff-beginning-of-hunk))
|
|
|
|
|
(ignore-errors (diff-hunk-next) (point))
|
|
|
|
|
max)))
|
|
|
|
|
(while (< beg max)
|
|
|
|
|
(goto-char beg)
|
|
|
|
|
(cl-assert (looking-at diff-hunk-header-re))
|
|
|
|
|
(let ((end
|
|
|
|
|
(save-excursion (diff-end-of-hunk) (point))))
|
|
|
|
|
(cl-assert (< beg end))
|
|
|
|
|
(funcall fun beg end)
|
|
|
|
|
(goto-char end)
|
|
|
|
|
(setq beg (if (looking-at diff-hunk-header-re)
|
|
|
|
|
end
|
|
|
|
|
(or (ignore-errors (diff-hunk-next) (point))
|
|
|
|
|
max))))))))
|
|
|
|
|
|
2018-07-10 22:52:21 -04:00
|
|
|
|
(defun diff--font-lock-refined (max)
|
|
|
|
|
"Apply hunk refinement from font-lock."
|
2019-02-24 16:13:13 +01:00
|
|
|
|
(when (eq diff-refine 'font-lock)
|
2018-07-10 22:52:21 -04:00
|
|
|
|
(when (get-char-property (point) 'diff--font-lock-refined)
|
|
|
|
|
;; Refinement works over a complete hunk, whereas font-lock limits itself
|
|
|
|
|
;; to highlighting smallish chunks between point..max, so we may be
|
|
|
|
|
;; called N times for a large hunk in which case we don't want to
|
|
|
|
|
;; rehighlight that hunk N times (especially since each highlighting
|
|
|
|
|
;; of a large hunk can itself take a long time, adding insult to injury).
|
|
|
|
|
;; So, after refining a hunk (including a failed attempt), we place an
|
|
|
|
|
;; overlay over the whole hunk to mark it as refined, to avoid redoing
|
|
|
|
|
;; the job redundantly when asked to highlight subsequent parts of the
|
|
|
|
|
;; same hunk.
|
|
|
|
|
(goto-char (next-single-char-property-change
|
|
|
|
|
(point) 'diff--font-lock-refined nil max)))
|
2021-06-24 18:07:25 +02:00
|
|
|
|
;; Ignore errors that diff cannot be found so that custom font-lock
|
|
|
|
|
;; keywords after `diff--font-lock-refined' can still be evaluated.
|
|
|
|
|
(ignore-error file-missing
|
|
|
|
|
(diff--iterate-hunks
|
|
|
|
|
max
|
|
|
|
|
(lambda (beg end)
|
|
|
|
|
(unless (get-char-property beg 'diff--font-lock-refined)
|
|
|
|
|
(diff--refine-hunk beg end)
|
|
|
|
|
(let ((ol (make-overlay beg end)))
|
|
|
|
|
(overlay-put ol 'diff--font-lock-refined t)
|
|
|
|
|
(overlay-put ol 'diff-mode 'fine)
|
|
|
|
|
(overlay-put ol 'evaporate t)
|
|
|
|
|
(overlay-put ol 'modification-hooks
|
|
|
|
|
'(diff--overlay-auto-delete)))))))))
|
2019-02-21 12:09:03 -05:00
|
|
|
|
|
|
|
|
|
(defun diff--overlay-auto-delete (ol _after _beg _end &optional _len)
|
2018-07-10 22:52:21 -04:00
|
|
|
|
(delete-overlay ol))
|
2007-10-09 04:12:24 +00:00
|
|
|
|
|
2012-04-26 11:43:32 +08:00
|
|
|
|
(defun diff-undo (&optional arg)
|
|
|
|
|
"Perform `undo', ignoring the buffer's read-only status."
|
|
|
|
|
(interactive "P")
|
|
|
|
|
(let ((inhibit-read-only t))
|
|
|
|
|
(undo arg)))
|
2007-10-09 04:12:24 +00:00
|
|
|
|
|
2019-07-04 20:32:39 -04:00
|
|
|
|
(defun diff-add-log-current-defuns ()
|
|
|
|
|
"Return an alist of defun names for the current diff.
|
|
|
|
|
The elements of the alist are of the form (FILE . (DEFUN...)),
|
|
|
|
|
where DEFUN... is a list of function names found in FILE."
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (point-min))
|
2020-03-20 06:00:11 -04:00
|
|
|
|
(let* ((defuns nil)
|
|
|
|
|
(hunk-end nil)
|
|
|
|
|
(hunk-mismatch-files nil)
|
|
|
|
|
(make-defun-context-follower
|
|
|
|
|
(lambda (goline)
|
|
|
|
|
(let ((eodefun nil)
|
|
|
|
|
(defname nil))
|
|
|
|
|
(list
|
|
|
|
|
(lambda () ;; Check for end of current defun.
|
|
|
|
|
(when (and eodefun
|
|
|
|
|
(funcall goline)
|
|
|
|
|
(>= (point) eodefun))
|
|
|
|
|
(setq defname nil)
|
|
|
|
|
(setq eodefun nil)))
|
|
|
|
|
(lambda (&optional get-current) ;; Check for new defun.
|
|
|
|
|
(if get-current
|
|
|
|
|
defname
|
|
|
|
|
(when-let* ((def (and (not eodefun)
|
|
|
|
|
(funcall goline)
|
|
|
|
|
(add-log-current-defun)))
|
|
|
|
|
(eof (save-excursion
|
|
|
|
|
(condition-case ()
|
|
|
|
|
(progn (end-of-defun) (point))
|
|
|
|
|
(scan-error hunk-end)))))
|
|
|
|
|
(setq eodefun eof)
|
|
|
|
|
(setq defname def)))))))))
|
2019-07-04 20:32:39 -04:00
|
|
|
|
(while
|
|
|
|
|
;; Might need to skip over file headers between diff
|
|
|
|
|
;; hunks (e.g., "diff --git ..." etc).
|
|
|
|
|
(re-search-forward diff-hunk-header-re nil t)
|
|
|
|
|
(setq hunk-end (save-excursion (diff-end-of-hunk)))
|
|
|
|
|
(pcase-let* ((filename (substring-no-properties (diff-find-file-name)))
|
|
|
|
|
(=lines 0)
|
|
|
|
|
(+lines 0)
|
|
|
|
|
(-lines 0)
|
|
|
|
|
(`(,buf ,line-offset (,beg . ,_end)
|
|
|
|
|
(,old-text . ,_old-offset)
|
|
|
|
|
(,new-text . ,_new-offset)
|
|
|
|
|
,applied)
|
|
|
|
|
;; Try to use the vc integration of
|
|
|
|
|
;; `diff-find-source-location', unless it
|
|
|
|
|
;; would look for non-existent files like
|
|
|
|
|
;; /dev/null.
|
|
|
|
|
(diff-find-source-location
|
2020-11-25 22:13:33 +01:00
|
|
|
|
(not (equal null-device
|
2019-07-04 20:32:39 -04:00
|
|
|
|
(car (diff-hunk-file-names t))))))
|
|
|
|
|
(other-buf nil)
|
|
|
|
|
(goto-otherbuf
|
|
|
|
|
;; If APPLIED, we have NEW-TEXT in BUF, so we
|
|
|
|
|
;; need to a buffer with OLD-TEXT to follow
|
|
|
|
|
;; -lines.
|
|
|
|
|
(lambda ()
|
|
|
|
|
(if other-buf (set-buffer other-buf)
|
|
|
|
|
(set-buffer (generate-new-buffer " *diff-other-text*"))
|
|
|
|
|
(insert (if applied old-text new-text))
|
|
|
|
|
(funcall (buffer-local-value 'major-mode buf))
|
|
|
|
|
(setq other-buf (current-buffer)))
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(forward-line (+ =lines -1
|
|
|
|
|
(if applied -lines +lines)))))
|
|
|
|
|
(gotobuf (lambda ()
|
|
|
|
|
(set-buffer buf)
|
|
|
|
|
(goto-char beg)
|
|
|
|
|
(forward-line (+ =lines -1
|
|
|
|
|
(if applied +lines -lines)))))
|
|
|
|
|
(`(,=ck-eodefun ,=ck-defun)
|
|
|
|
|
(funcall make-defun-context-follower gotobuf))
|
|
|
|
|
(`(,-ck-eodefun ,-ck-defun)
|
|
|
|
|
(funcall make-defun-context-follower
|
|
|
|
|
(if applied goto-otherbuf gotobuf)))
|
|
|
|
|
(`(,+ck-eodefun ,+ck-defun)
|
|
|
|
|
(funcall make-defun-context-follower
|
|
|
|
|
(if applied gotobuf goto-otherbuf))))
|
|
|
|
|
(unless (eql line-offset 0)
|
|
|
|
|
(cl-pushnew filename hunk-mismatch-files :test #'equal))
|
|
|
|
|
;; Some modes always return nil for `add-log-current-defun',
|
|
|
|
|
;; make sure at least the filename is included.
|
|
|
|
|
(unless (assoc filename defuns)
|
|
|
|
|
(push (cons filename nil) defuns))
|
|
|
|
|
(unwind-protect
|
|
|
|
|
(while (progn (forward-line)
|
|
|
|
|
(< (point) hunk-end))
|
|
|
|
|
(let ((patch-char (char-after)))
|
|
|
|
|
(pcase patch-char
|
|
|
|
|
(?+ (cl-incf +lines))
|
|
|
|
|
(?- (cl-incf -lines))
|
|
|
|
|
(?\s (cl-incf =lines)))
|
|
|
|
|
(save-current-buffer
|
|
|
|
|
(funcall =ck-eodefun)
|
|
|
|
|
(funcall +ck-eodefun)
|
|
|
|
|
(funcall -ck-eodefun)
|
|
|
|
|
(when-let* ((def (cond
|
|
|
|
|
((eq patch-char ?\s)
|
|
|
|
|
;; Just updating context defun.
|
|
|
|
|
(ignore (funcall =ck-defun)))
|
|
|
|
|
;; + or - in existing defun.
|
|
|
|
|
((funcall =ck-defun t))
|
|
|
|
|
;; Check added or removed defun.
|
|
|
|
|
(t (funcall (if (eq ?+ patch-char)
|
|
|
|
|
+ck-defun -ck-defun))))))
|
|
|
|
|
(cl-pushnew def (alist-get filename defuns
|
|
|
|
|
nil nil #'equal)
|
|
|
|
|
:test #'equal)))))
|
|
|
|
|
(when (buffer-live-p other-buf)
|
|
|
|
|
(kill-buffer other-buf)))))
|
|
|
|
|
(when hunk-mismatch-files
|
|
|
|
|
(message "Diff didn't match for %s."
|
|
|
|
|
(mapconcat #'identity hunk-mismatch-files ", ")))
|
|
|
|
|
(dolist (file-defuns defuns)
|
|
|
|
|
(cl-callf nreverse (cdr file-defuns)))
|
|
|
|
|
(nreverse defuns))))
|
|
|
|
|
|
2008-02-05 02:14:10 +00:00
|
|
|
|
(defun diff-add-change-log-entries-other-window ()
|
|
|
|
|
"Iterate through the current diff and create ChangeLog entries.
|
|
|
|
|
I.e. like `add-change-log-entry-other-window' but applied to all hunks."
|
2008-02-04 21:41:09 +00:00
|
|
|
|
(interactive)
|
|
|
|
|
;; XXX: Currently add-change-log-entry-other-window is only called
|
|
|
|
|
;; once per hunk. Some hunks have multiple changes, it would be
|
|
|
|
|
;; good to call it for each change.
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (point-min))
|
2011-03-11 15:04:22 -05:00
|
|
|
|
(condition-case nil
|
|
|
|
|
;; Call add-change-log-entry-other-window for each hunk in
|
|
|
|
|
;; the diff buffer.
|
|
|
|
|
(while (progn
|
|
|
|
|
(diff-hunk-next)
|
|
|
|
|
;; Move to where the changes are,
|
|
|
|
|
;; `add-change-log-entry-other-window' works better in
|
|
|
|
|
;; that case.
|
|
|
|
|
(re-search-forward
|
2019-03-26 19:06:36 -07:00
|
|
|
|
(concat "\n[!+<>-]"
|
2011-03-11 15:04:22 -05:00
|
|
|
|
;; If the hunk is a context hunk with an empty first
|
|
|
|
|
;; half, recognize the "--- NNN,MMM ----" line
|
|
|
|
|
"\\(-- [0-9]+\\(,[0-9]+\\)? ----\n"
|
|
|
|
|
;; and skip to the next non-context line.
|
|
|
|
|
"\\( .*\n\\)*[+]\\)?")
|
|
|
|
|
nil t))
|
|
|
|
|
(save-excursion
|
|
|
|
|
;; FIXME: this pops up windows of all the buffers.
|
|
|
|
|
(add-change-log-entry nil nil t nil t)))
|
|
|
|
|
;; When there's no more hunks, diff-hunk-next signals an error.
|
|
|
|
|
(error nil))))
|
2008-02-04 21:41:09 +00:00
|
|
|
|
|
2012-11-09 01:31:53 +08:00
|
|
|
|
(defun diff-delete-trailing-whitespace (&optional other-file)
|
|
|
|
|
"Remove trailing whitespace from lines modified in this diff.
|
|
|
|
|
This edits both the current Diff mode buffer and the patched
|
|
|
|
|
source file(s). If `diff-jump-to-old-file' is non-nil, edit the
|
|
|
|
|
original (unpatched) source file instead. With a prefix argument
|
|
|
|
|
OTHER-FILE, flip the choice of which source file to edit.
|
|
|
|
|
|
|
|
|
|
If a file referenced in the diff has no buffer and needs to be
|
|
|
|
|
fixed, visit it in a buffer."
|
|
|
|
|
(interactive "P")
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (point-min))
|
2019-07-31 19:45:06 +02:00
|
|
|
|
(let* ((other (xor other-file diff-jump-to-old-file))
|
2012-11-09 01:31:53 +08:00
|
|
|
|
(modified-buffers nil)
|
|
|
|
|
(style (save-excursion
|
|
|
|
|
(when (re-search-forward diff-hunk-header-re nil t)
|
|
|
|
|
(goto-char (match-beginning 0))
|
|
|
|
|
(diff-hunk-style))))
|
|
|
|
|
(regexp (concat "^[" (if other "-<" "+>") "!]"
|
|
|
|
|
(if (eq style 'context) " " "")
|
|
|
|
|
".*?\\([ \t]+\\)$"))
|
|
|
|
|
(inhibit-read-only t)
|
|
|
|
|
(end-marker (make-marker))
|
|
|
|
|
hunk-end)
|
|
|
|
|
;; Move to the first hunk.
|
|
|
|
|
(re-search-forward diff-hunk-header-re nil 1)
|
|
|
|
|
(while (progn (save-excursion
|
|
|
|
|
(re-search-forward diff-hunk-header-re nil 1)
|
|
|
|
|
(setq hunk-end (point)))
|
|
|
|
|
(< (point) hunk-end))
|
|
|
|
|
;; For context diffs, search only in the appropriate half of
|
|
|
|
|
;; the hunk. For other diffs, search within the entire hunk.
|
|
|
|
|
(if (not (eq style 'context))
|
|
|
|
|
(set-marker end-marker hunk-end)
|
|
|
|
|
(let ((mid-hunk
|
|
|
|
|
(save-excursion
|
|
|
|
|
(re-search-forward diff-context-mid-hunk-header-re hunk-end)
|
|
|
|
|
(point))))
|
|
|
|
|
(if other
|
|
|
|
|
(set-marker end-marker mid-hunk)
|
|
|
|
|
(goto-char mid-hunk)
|
|
|
|
|
(set-marker end-marker hunk-end))))
|
|
|
|
|
(while (re-search-forward regexp end-marker t)
|
|
|
|
|
(let ((match-data (match-data)))
|
|
|
|
|
(pcase-let ((`(,buf ,line-offset ,pos ,src ,_dst ,_switched)
|
|
|
|
|
(diff-find-source-location other-file)))
|
|
|
|
|
(when line-offset
|
|
|
|
|
;; Remove the whitespace in the Diff mode buffer.
|
|
|
|
|
(set-match-data match-data)
|
|
|
|
|
(replace-match "" t t nil 1)
|
|
|
|
|
;; Remove the whitespace in the source buffer.
|
|
|
|
|
(with-current-buffer buf
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (+ (car pos) (cdr src)))
|
|
|
|
|
(beginning-of-line)
|
|
|
|
|
(when (re-search-forward "\\([ \t]+\\)$" (line-end-position) t)
|
|
|
|
|
(unless (memq buf modified-buffers)
|
|
|
|
|
(push buf modified-buffers))
|
|
|
|
|
(replace-match ""))))))))
|
|
|
|
|
(goto-char hunk-end))
|
|
|
|
|
(if modified-buffers
|
|
|
|
|
(message "Deleted trailing whitespace from %s."
|
2015-08-28 22:24:10 -07:00
|
|
|
|
(mapconcat (lambda (buf) (format-message
|
|
|
|
|
"`%s'" (buffer-name buf)))
|
2012-11-09 01:31:53 +08:00
|
|
|
|
modified-buffers ", "))
|
|
|
|
|
(message "No trailing whitespace to delete.")))))
|
2012-08-08 00:41:35 -04:00
|
|
|
|
|
2018-07-13 12:34:50 -04:00
|
|
|
|
|
|
|
|
|
;;; Prettifying from font-lock
|
|
|
|
|
|
2018-10-21 11:05:49 -04:00
|
|
|
|
(define-fringe-bitmap 'diff-fringe-add
|
|
|
|
|
[#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00010000
|
|
|
|
|
#b00010000
|
|
|
|
|
#b01111100
|
|
|
|
|
#b00010000
|
|
|
|
|
#b00010000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000]
|
|
|
|
|
nil nil 'center)
|
|
|
|
|
|
|
|
|
|
(define-fringe-bitmap 'diff-fringe-del
|
|
|
|
|
[#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b01111100
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000]
|
|
|
|
|
nil nil 'center)
|
|
|
|
|
|
|
|
|
|
(define-fringe-bitmap 'diff-fringe-rep
|
|
|
|
|
[#b00000000
|
|
|
|
|
#b00010000
|
|
|
|
|
#b00010000
|
|
|
|
|
#b00010000
|
|
|
|
|
#b00010000
|
|
|
|
|
#b00010000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00010000
|
|
|
|
|
#b00000000]
|
|
|
|
|
nil nil 'center)
|
|
|
|
|
|
|
|
|
|
(define-fringe-bitmap 'diff-fringe-nul
|
|
|
|
|
;; Maybe there should be such an "empty" bitmap defined by default?
|
|
|
|
|
[#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000
|
|
|
|
|
#b00000000]
|
|
|
|
|
nil nil 'center)
|
|
|
|
|
|
2018-07-13 12:34:50 -04:00
|
|
|
|
(defun diff--font-lock-prettify (limit)
|
|
|
|
|
(when diff-font-lock-prettify
|
2018-10-21 11:05:49 -04:00
|
|
|
|
(save-excursion
|
|
|
|
|
;; FIXME: Include the first space for context-style hunks!
|
|
|
|
|
(while (re-search-forward "^[-+! ]" limit t)
|
|
|
|
|
(let ((spec (alist-get (char-before)
|
2018-12-19 01:10:09 +02:00
|
|
|
|
'((?+ . (left-fringe diff-fringe-add diff-indicator-added))
|
|
|
|
|
(?- . (left-fringe diff-fringe-del diff-indicator-removed))
|
|
|
|
|
(?! . (left-fringe diff-fringe-rep diff-indicator-changed))
|
2020-08-14 17:32:23 +02:00
|
|
|
|
(?\s . (left-fringe diff-fringe-nul fringe))))))
|
2018-10-21 11:05:49 -04:00
|
|
|
|
(put-text-property (match-beginning 0) (match-end 0) 'display spec))))
|
|
|
|
|
;; Mimicks the output of Magit's diff.
|
|
|
|
|
;; FIXME: This has only been tested with Git's diff output.
|
2018-07-13 12:34:50 -04:00
|
|
|
|
(while (re-search-forward "^diff " limit t)
|
2018-10-21 11:05:49 -04:00
|
|
|
|
;; FIXME: Switching between context<->unified leads to messed up
|
|
|
|
|
;; file headers by cutting the `display' property in chunks!
|
2018-07-13 12:34:50 -04:00
|
|
|
|
(when (save-excursion
|
2018-10-21 11:05:49 -04:00
|
|
|
|
(forward-line 0)
|
|
|
|
|
(looking-at
|
|
|
|
|
(eval-when-compile
|
|
|
|
|
(concat "diff.*\n"
|
|
|
|
|
"\\(?:\\(?:new file\\|deleted\\).*\n\\)?"
|
|
|
|
|
"\\(?:index.*\n\\)?"
|
2020-11-25 22:13:33 +01:00
|
|
|
|
"--- \\(?:" null-device "\\|a/\\(.*\\)\\)\n"
|
|
|
|
|
"\\+\\+\\+ \\(?:" null-device "\\|b/\\(.*\\)\\)\n"))))
|
2018-07-13 12:34:50 -04:00
|
|
|
|
(put-text-property (match-beginning 0)
|
|
|
|
|
(or (match-beginning 2) (match-beginning 1))
|
|
|
|
|
'display (propertize
|
|
|
|
|
(cond
|
|
|
|
|
((null (match-beginning 1)) "new file ")
|
|
|
|
|
((null (match-beginning 2)) "deleted ")
|
|
|
|
|
(t "modified "))
|
|
|
|
|
'face '(diff-file-header diff-header)))
|
|
|
|
|
(unless (match-beginning 2)
|
|
|
|
|
(put-text-property (match-end 1) (1- (match-end 0))
|
|
|
|
|
'display "")))))
|
|
|
|
|
nil)
|
|
|
|
|
|
2018-12-18 01:11:15 +02:00
|
|
|
|
;;; Syntax highlighting from font-lock
|
|
|
|
|
|
|
|
|
|
(defun diff--font-lock-syntax (max)
|
|
|
|
|
"Apply source language syntax highlighting from font-lock.
|
|
|
|
|
Calls `diff-syntax-fontify' on every hunk found between point
|
|
|
|
|
and the position in MAX."
|
|
|
|
|
(when diff-font-lock-syntax
|
|
|
|
|
(when (get-char-property (point) 'diff--font-lock-syntax)
|
|
|
|
|
(goto-char (next-single-char-property-change
|
|
|
|
|
(point) 'diff--font-lock-syntax nil max)))
|
2019-02-21 12:09:03 -05:00
|
|
|
|
(diff--iterate-hunks
|
|
|
|
|
max
|
|
|
|
|
(lambda (beg end)
|
|
|
|
|
(unless (get-char-property beg 'diff--font-lock-syntax)
|
|
|
|
|
(diff-syntax-fontify beg end)
|
|
|
|
|
(let ((ol (make-overlay beg end)))
|
|
|
|
|
(overlay-put ol 'diff--font-lock-syntax t)
|
|
|
|
|
(overlay-put ol 'diff-mode 'syntax)
|
|
|
|
|
(overlay-put ol 'evaporate t)
|
|
|
|
|
(overlay-put ol 'modification-hooks
|
|
|
|
|
'(diff--overlay-auto-delete))))))))
|
2018-12-18 01:11:15 +02:00
|
|
|
|
|
|
|
|
|
(defun diff-syntax-fontify (beg end)
|
|
|
|
|
"Highlight source language syntax in diff hunk between BEG and END."
|
2019-02-02 23:23:16 +02:00
|
|
|
|
(remove-overlays beg end 'diff-mode 'syntax)
|
2018-12-18 01:11:15 +02:00
|
|
|
|
(save-excursion
|
|
|
|
|
(diff-syntax-fontify-hunk beg end t)
|
|
|
|
|
(diff-syntax-fontify-hunk beg end nil)))
|
|
|
|
|
|
2018-12-19 00:55:15 +02:00
|
|
|
|
(eval-when-compile (require 'subr-x)) ; for string-trim-right
|
|
|
|
|
|
2019-04-11 21:06:59 -04:00
|
|
|
|
(defvar-local diff--syntax-file-attributes nil)
|
|
|
|
|
(put 'diff--syntax-file-attributes 'permanent-local t)
|
|
|
|
|
|
2018-12-18 01:11:15 +02:00
|
|
|
|
(defun diff-syntax-fontify-hunk (beg end old)
|
|
|
|
|
"Highlight source language syntax in diff hunk between BEG and END.
|
|
|
|
|
When OLD is non-nil, highlight the hunk from the old source."
|
|
|
|
|
(goto-char beg)
|
|
|
|
|
(let* ((hunk (buffer-substring-no-properties beg end))
|
2019-02-02 23:23:16 +02:00
|
|
|
|
;; Trim a trailing newline to find hunk in diff-syntax-fontify-props
|
|
|
|
|
;; in diffs that have no newline at end of diff file.
|
2019-04-09 11:09:11 -04:00
|
|
|
|
(text (string-trim-right
|
|
|
|
|
(or (with-demoted-errors (diff-hunk-text hunk (not old) nil))
|
|
|
|
|
"")))
|
2018-12-18 01:11:15 +02:00
|
|
|
|
(line (if (looking-at "\\(?:\\*\\{15\\}.*\n\\)?[-@* ]*\\([0-9,]+\\)\\([ acd+]+\\([0-9,]+\\)\\)?")
|
|
|
|
|
(if old (match-string 1)
|
|
|
|
|
(if (match-end 3) (match-string 3) (match-string 1)))))
|
2018-12-19 00:55:15 +02:00
|
|
|
|
(line-nb (when line
|
|
|
|
|
(if (string-match "\\([0-9]+\\),\\([0-9]+\\)" line)
|
|
|
|
|
(list (string-to-number (match-string 1 line))
|
|
|
|
|
(string-to-number (match-string 2 line)))
|
|
|
|
|
(list (string-to-number line) 1)))) ; One-line diffs
|
2019-04-09 11:09:11 -04:00
|
|
|
|
(props
|
2019-04-09 18:39:22 -04:00
|
|
|
|
(or
|
|
|
|
|
(when (and diff-vc-backend
|
|
|
|
|
(not (eq diff-font-lock-syntax 'hunk-only)))
|
|
|
|
|
(let* ((file (diff-find-file-name old t))
|
2019-04-16 23:51:51 +03:00
|
|
|
|
(file (and file (expand-file-name file)))
|
2019-04-09 18:39:22 -04:00
|
|
|
|
(revision (and file (if (not old) (nth 1 diff-vc-revisions)
|
|
|
|
|
(or (nth 0 diff-vc-revisions)
|
|
|
|
|
(vc-working-revision file))))))
|
|
|
|
|
(when file
|
|
|
|
|
(if (not revision)
|
|
|
|
|
;; Get properties from the current working revision
|
2019-04-11 21:06:59 -04:00
|
|
|
|
(when (and (not old) (file-readable-p file)
|
2019-04-09 18:39:22 -04:00
|
|
|
|
(file-regular-p file))
|
2019-04-16 23:51:51 +03:00
|
|
|
|
(let ((buf (get-file-buffer file)))
|
2019-04-09 18:39:22 -04:00
|
|
|
|
;; Try to reuse an existing buffer
|
|
|
|
|
(if buf
|
|
|
|
|
(with-current-buffer buf
|
|
|
|
|
(diff-syntax-fontify-props nil text line-nb))
|
2019-04-11 21:06:59 -04:00
|
|
|
|
;; Get properties from the file.
|
|
|
|
|
(with-current-buffer (get-buffer-create
|
|
|
|
|
" *diff-syntax-file*")
|
|
|
|
|
(let ((attrs (file-attributes file)))
|
|
|
|
|
(if (equal diff--syntax-file-attributes attrs)
|
|
|
|
|
;; Same file as last-time, unmodified.
|
|
|
|
|
;; Reuse buffer as-is.
|
|
|
|
|
(setq file nil)
|
2019-04-16 23:51:51 +03:00
|
|
|
|
(erase-buffer)
|
2019-04-11 21:06:59 -04:00
|
|
|
|
(insert-file-contents file)
|
|
|
|
|
(setq diff--syntax-file-attributes attrs)))
|
2019-04-09 18:39:22 -04:00
|
|
|
|
(diff-syntax-fontify-props file text line-nb)))))
|
|
|
|
|
;; Get properties from a cached revision
|
|
|
|
|
(let* ((buffer-name (format " *diff-syntax:%s.~%s~*"
|
2019-04-16 23:51:51 +03:00
|
|
|
|
file revision))
|
2019-04-11 21:06:59 -04:00
|
|
|
|
(buffer (get-buffer buffer-name)))
|
|
|
|
|
(if buffer
|
|
|
|
|
;; Don't re-initialize the buffer (which would throw
|
|
|
|
|
;; away the previous fontification work).
|
|
|
|
|
(setq file nil)
|
|
|
|
|
(setq buffer (ignore-errors
|
|
|
|
|
(vc-find-revision-no-save
|
2019-04-16 23:51:51 +03:00
|
|
|
|
file revision
|
2019-04-11 21:06:59 -04:00
|
|
|
|
diff-vc-backend
|
|
|
|
|
(get-buffer-create buffer-name)))))
|
2019-04-09 18:39:22 -04:00
|
|
|
|
(when buffer
|
|
|
|
|
(with-current-buffer buffer
|
|
|
|
|
(diff-syntax-fontify-props file text line-nb))))))))
|
|
|
|
|
(let ((file (car (diff-hunk-file-names old))))
|
|
|
|
|
(cond
|
|
|
|
|
((and file diff-default-directory
|
|
|
|
|
(not (eq diff-font-lock-syntax 'hunk-only))
|
|
|
|
|
(not diff-vc-backend)
|
|
|
|
|
(file-readable-p file) (file-regular-p file))
|
|
|
|
|
;; Try to get full text from the file.
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert-file-contents file)
|
|
|
|
|
(diff-syntax-fontify-props file text line-nb)))
|
|
|
|
|
;; Otherwise, get properties from the hunk alone
|
|
|
|
|
((memq diff-font-lock-syntax '(hunk-also hunk-only))
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(insert text)
|
|
|
|
|
(diff-syntax-fontify-props file text line-nb t))))))))
|
2018-12-18 01:11:15 +02:00
|
|
|
|
|
|
|
|
|
;; Put properties over the hunk text
|
|
|
|
|
(goto-char beg)
|
|
|
|
|
(when (and props (eq (diff-hunk-style) 'unified))
|
|
|
|
|
(while (< (progn (forward-line 1) (point)) end)
|
2019-04-09 11:09:11 -04:00
|
|
|
|
;; Skip the "\ No newline at end of file" lines as well as the lines
|
|
|
|
|
;; corresponding to the "other" version.
|
|
|
|
|
(unless (looking-at-p (if old "[+>\\]" "[-<\\]"))
|
|
|
|
|
(if (and old (not (looking-at-p "[-<]")))
|
|
|
|
|
;; Fontify context lines only from new source,
|
|
|
|
|
;; don't refontify context lines from old source.
|
|
|
|
|
(pop props)
|
|
|
|
|
(let ((line-props (pop props))
|
|
|
|
|
(bol (1+ (point))))
|
|
|
|
|
(dolist (prop line-props)
|
|
|
|
|
;; Ideally, we'd want to use text-properties as in:
|
|
|
|
|
;;
|
|
|
|
|
;; (add-face-text-property
|
|
|
|
|
;; (+ bol (nth 0 prop)) (+ bol (nth 1 prop))
|
|
|
|
|
;; (nth 2 prop) 'append)
|
|
|
|
|
;;
|
|
|
|
|
;; rather than overlays here, but they'd get removed by later
|
|
|
|
|
;; font-locking.
|
|
|
|
|
;; This is because we also apply faces outside of the
|
|
|
|
|
;; beg...end chunk currently font-locked and when font-lock
|
|
|
|
|
;; later comes to handle the rest of the hunk that we already
|
|
|
|
|
;; handled we don't (want to) redo it (we work at
|
|
|
|
|
;; hunk-granularity rather than font-lock's own chunk
|
|
|
|
|
;; granularity).
|
|
|
|
|
;; I see two ways to fix this:
|
|
|
|
|
;; - don't immediately apply the props that fall outside of
|
|
|
|
|
;; font-lock's chunk but stash them somewhere (e.g. in another
|
|
|
|
|
;; text property) and only later when font-lock comes back
|
|
|
|
|
;; move them to `face'.
|
|
|
|
|
;; - change the code so work at font-lock's chunk granularity
|
|
|
|
|
;; (this seems doable without too much extra overhead,
|
|
|
|
|
;; contrary to the refine highlighting, which inherently
|
|
|
|
|
;; works at a different granularity).
|
|
|
|
|
(let ((ol (make-overlay (+ bol (nth 0 prop))
|
|
|
|
|
(+ bol (nth 1 prop))
|
|
|
|
|
nil 'front-advance nil)))
|
|
|
|
|
(overlay-put ol 'diff-mode 'syntax)
|
|
|
|
|
(overlay-put ol 'evaporate t)
|
|
|
|
|
(overlay-put ol 'face (nth 2 prop)))))))))))
|
2018-12-18 01:11:15 +02:00
|
|
|
|
|
2019-02-21 12:09:03 -05:00
|
|
|
|
(defun diff-syntax-fontify-props (file text line-nb &optional hunk-only)
|
2018-12-18 01:11:15 +02:00
|
|
|
|
"Get font-lock properties from the source code.
|
2019-02-21 12:09:03 -05:00
|
|
|
|
FILE is the name of the source file. If non-nil, it requests initialization
|
|
|
|
|
of the mode according to FILE.
|
|
|
|
|
TEXT is the literal source text from hunk.
|
|
|
|
|
LINE-NB is a pair of numbers: start line number and the number of
|
2019-04-09 11:09:11 -04:00
|
|
|
|
lines in the hunk.
|
|
|
|
|
When HUNK-ONLY is non-nil, then don't verify the existence of the
|
2018-12-18 01:11:15 +02:00
|
|
|
|
hunk text in the source file. Otherwise, don't highlight the hunk if the
|
|
|
|
|
hunk text is not found in the source file."
|
2019-02-21 12:09:03 -05:00
|
|
|
|
(when file
|
|
|
|
|
;; When initialization is requested, we should be in a brand new
|
|
|
|
|
;; temp buffer.
|
|
|
|
|
(cl-assert (null buffer-file-name))
|
2020-03-27 01:44:17 +02:00
|
|
|
|
;; Use `:safe' to find `mode:'. In case of hunk-only, use nil because
|
|
|
|
|
;; Local Variables list might be incomplete when context is truncated.
|
|
|
|
|
(let ((enable-local-variables (unless hunk-only :safe))
|
2018-12-18 01:11:15 +02:00
|
|
|
|
(buffer-file-name file))
|
2020-02-06 00:38:53 +02:00
|
|
|
|
;; Don't run hooks that might assume buffer-file-name
|
|
|
|
|
;; really associates buffer with a file (bug#39190).
|
|
|
|
|
(delay-mode-hooks (set-auto-mode))
|
2019-04-09 11:09:11 -04:00
|
|
|
|
;; FIXME: Is this really worth the trouble?
|
|
|
|
|
(when (and (fboundp 'generic-mode-find-file-hook)
|
|
|
|
|
(memq #'generic-mode-find-file-hook
|
|
|
|
|
;; There's no point checking the buffer-local value,
|
|
|
|
|
;; we're in a fresh new buffer.
|
|
|
|
|
(default-value 'find-file-hook)))
|
2018-12-18 01:11:15 +02:00
|
|
|
|
(generic-mode-find-file-hook))))
|
|
|
|
|
|
|
|
|
|
(let ((font-lock-defaults (or font-lock-defaults '(nil t)))
|
|
|
|
|
props beg end)
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(if hunk-only
|
|
|
|
|
(setq beg (point-min) end (point-max))
|
|
|
|
|
(forward-line (1- (nth 0 line-nb)))
|
|
|
|
|
;; non-regexp looking-at to compare hunk text for verification
|
|
|
|
|
(if (search-forward text (+ (point) (length text)) t)
|
|
|
|
|
(setq beg (- (point) (length text)) end (point))
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(if (search-forward text nil t)
|
|
|
|
|
(setq beg (- (point) (length text)) end (point)))))
|
|
|
|
|
|
|
|
|
|
(when (and beg end)
|
|
|
|
|
(goto-char beg)
|
2018-12-19 23:55:32 +02:00
|
|
|
|
(font-lock-ensure beg end)
|
2018-12-18 01:11:15 +02:00
|
|
|
|
|
|
|
|
|
(while (< (point) end)
|
|
|
|
|
(let* ((bol (point))
|
|
|
|
|
(eol (line-end-position))
|
|
|
|
|
line-props
|
|
|
|
|
(searching t)
|
|
|
|
|
(from (point)) to
|
|
|
|
|
(val (get-text-property from 'face)))
|
|
|
|
|
(while searching
|
|
|
|
|
(setq to (next-single-property-change from 'face nil eol))
|
|
|
|
|
(when val (push (list (- from bol) (- to bol) val) line-props))
|
|
|
|
|
(setq val (get-text-property to 'face) from to)
|
|
|
|
|
(unless (< to eol) (setq searching nil)))
|
|
|
|
|
(when val (push (list from eol val) line-props))
|
|
|
|
|
(push (nreverse line-props) props))
|
|
|
|
|
(forward-line 1)))
|
|
|
|
|
(nreverse props)))
|
|
|
|
|
|
|
|
|
|
|
2018-10-21 11:05:49 -04:00
|
|
|
|
(defun diff--filter-substring (str)
|
|
|
|
|
(when diff-font-lock-prettify
|
|
|
|
|
;; Strip the `display' properties added by diff-font-lock-prettify,
|
|
|
|
|
;; since they look weird when you kill&yank!
|
|
|
|
|
(remove-text-properties 0 (length str) '(display nil) str)
|
|
|
|
|
;; We could also try to only remove those `display' properties actually
|
|
|
|
|
;; added by diff-font-lock-prettify rather than removing them all blindly.
|
|
|
|
|
;; E.g.:
|
|
|
|
|
;;(let ((len (length str))
|
|
|
|
|
;; (i 0))
|
|
|
|
|
;; (while (and (< i len)
|
|
|
|
|
;; (setq i (text-property-not-all i len 'display nil str)))
|
|
|
|
|
;; (let* ((val (get-text-property i 'display str))
|
|
|
|
|
;; (end (or (text-property-not-all i len 'display val str) len)))
|
|
|
|
|
;; ;; FIXME: Check for display props that prettify the file header!
|
|
|
|
|
;; (when (eq 'left-fringe (car-safe val))
|
|
|
|
|
;; ;; FIXME: Should we check that it's a diff-fringe-* bitmap?
|
|
|
|
|
;; (remove-text-properties i end '(display nil) str))
|
|
|
|
|
;; (setq i end))))
|
|
|
|
|
)
|
|
|
|
|
str)
|
|
|
|
|
|
2018-02-18 00:47:00 -05:00
|
|
|
|
;;; Support for converting a diff to diff3 markers via `wiggle'.
|
|
|
|
|
|
2021-03-24 09:28:32 +01:00
|
|
|
|
;; Wiggle can be found at https://neil.brown.name/wiggle/ or in your nearest
|
2018-02-18 00:47:00 -05:00
|
|
|
|
;; Debian repository.
|
|
|
|
|
|
|
|
|
|
(defun diff-wiggle ()
|
|
|
|
|
"Use `wiggle' to apply the whole current file diff by hook or by crook.
|
|
|
|
|
When a hunk can't cleanly be applied, it gets turned into a diff3-style
|
|
|
|
|
conflict."
|
|
|
|
|
(interactive)
|
|
|
|
|
(let* ((bounds (diff-bounds-of-file))
|
|
|
|
|
(file (diff-find-file-name))
|
|
|
|
|
(tmpbuf (current-buffer))
|
|
|
|
|
(filebuf (find-buffer-visiting file))
|
|
|
|
|
(patchfile (make-temp-file
|
|
|
|
|
(expand-file-name "wiggle" (file-name-directory file))
|
|
|
|
|
nil ".diff"))
|
|
|
|
|
(errfile (make-temp-file
|
|
|
|
|
(expand-file-name "wiggle" (file-name-directory file))
|
|
|
|
|
nil ".error")))
|
|
|
|
|
(unwind-protect
|
|
|
|
|
(with-temp-buffer
|
|
|
|
|
(set-buffer (prog1 tmpbuf (setq tmpbuf (current-buffer))))
|
|
|
|
|
(when (buffer-modified-p filebuf)
|
|
|
|
|
(save-some-buffers nil (lambda () (eq (current-buffer) filebuf)))
|
2018-10-21 11:05:49 -04:00
|
|
|
|
(if (buffer-modified-p filebuf) (user-error "Abort!")))
|
2018-02-18 00:47:00 -05:00
|
|
|
|
(write-region (car bounds) (cadr bounds) patchfile nil 'silent)
|
|
|
|
|
(let ((exitcode
|
|
|
|
|
(call-process "wiggle" nil (list tmpbuf errfile) nil
|
|
|
|
|
file patchfile)))
|
|
|
|
|
(if (not (memq exitcode '(0 1)))
|
|
|
|
|
(message "diff-wiggle error: %s"
|
|
|
|
|
(with-current-buffer tmpbuf
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(insert-file-contents errfile)
|
|
|
|
|
(buffer-string)))
|
|
|
|
|
(with-current-buffer tmpbuf
|
|
|
|
|
(write-region nil nil file nil 'silent)
|
|
|
|
|
(with-current-buffer filebuf
|
|
|
|
|
(revert-buffer t t t)
|
|
|
|
|
(save-excursion
|
|
|
|
|
(goto-char (point-min))
|
|
|
|
|
(if (re-search-forward "^<<<<<<<" nil t)
|
|
|
|
|
(smerge-mode 1)))
|
|
|
|
|
(pop-to-buffer filebuf))))))
|
|
|
|
|
(delete-file patchfile)
|
|
|
|
|
(delete-file errfile))))
|
|
|
|
|
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;; provide the package
|
|
|
|
|
(provide 'diff-mode)
|
|
|
|
|
|
2000-08-16 19:56:10 +00:00
|
|
|
|
;;; Old Change Log from when diff-mode wasn't part of Emacs:
|
1999-10-09 23:52:39 +00:00
|
|
|
|
;; Revision 1.11 1999/10/09 23:38:29 monnier
|
|
|
|
|
;; (diff-mode-load-hook): dropped.
|
|
|
|
|
;; (auto-mode-alist): also catch *.diffs.
|
|
|
|
|
;; (diff-find-file-name, diff-mode): add smarts to find the right file
|
|
|
|
|
;; for *.rej files (that lack any file name indication).
|
|
|
|
|
;;
|
|
|
|
|
;; Revision 1.10 1999/09/30 15:32:11 monnier
|
|
|
|
|
;; added support for "\ No newline at end of file".
|
|
|
|
|
;;
|
|
|
|
|
;; Revision 1.9 1999/09/15 00:01:13 monnier
|
|
|
|
|
;; - added basic `compile' support.
|
|
|
|
|
;; - have diff-kill-hunk call diff-kill-file if it's the only hunk.
|
|
|
|
|
;; - diff-kill-file now tries to kill the leading garbage as well.
|
|
|
|
|
;;
|
|
|
|
|
;; Revision 1.8 1999/09/13 21:10:09 monnier
|
|
|
|
|
;; - don't use CL in the autoloaded code
|
|
|
|
|
;; - accept diffs using -T
|
|
|
|
|
;;
|
|
|
|
|
;; Revision 1.7 1999/09/05 20:53:03 monnier
|
|
|
|
|
;; interface to ediff-patch
|
|
|
|
|
;;
|
|
|
|
|
;; Revision 1.6 1999/09/01 20:55:13 monnier
|
|
|
|
|
;; (ediff=patch-file): add bindings to call ediff-patch.
|
|
|
|
|
;; (diff-find-file-name): taken out of diff-goto-source.
|
|
|
|
|
;; (diff-unified->context, diff-context->unified, diff-reverse-direction,
|
|
|
|
|
;; diff-fixup-modifs): only use the region if a prefix arg is given.
|
|
|
|
|
;;
|
|
|
|
|
;; Revision 1.5 1999/08/31 19:18:52 monnier
|
|
|
|
|
;; (diff-beginning-of-file, diff-prev-file): fixed wrong parenthesis.
|
|
|
|
|
;;
|
|
|
|
|
;; Revision 1.4 1999/08/31 13:01:44 monnier
|
|
|
|
|
;; use `combine-after-change-calls' to minimize the slowdown of font-lock.
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
;;; diff-mode.el ends here
|