From 41f5de7c8ac3da19ccc8c96be52a6714a9b49a8f Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Fri, 13 Jul 2018 12:34:50 -0400 Subject: [PATCH] * lisp/vc/diff-mode.el (diff-font-lock-prettify): New var (diff--font-lock-prettify): New function. (diff-font-lock-keywords): Use it. --- etc/NEWS | 7 +++++++ lisp/vc/diff-mode.el | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/etc/NEWS b/etc/NEWS index 1a1e0d8b70e..c69bbe9d0f6 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -212,6 +212,13 @@ navigation and editing of large files. * Changes in Specialized Modes and Packages in Emacs 27.1 +** diff-mode +*** Hunks are now automatically refined by default +To disable it, set the new defcustom 'diff-font-lock-refine' to nil. + +*** File headers can be shortened, mimicking Magit's diff format +To enable it, set the new defcustom 'diff-font-lock-prettify to t. + ** Browse-url *** The function 'browse-url-emacs' can now visit a URL in selected window. diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index ffbd9e5479a..b91a2ba45a4 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -96,6 +96,11 @@ when editing big diffs)." :version "27.1" :type 'boolean) +(defcustom diff-font-lock-prettify nil + "If non-nil, font-lock will try and make the format prettier." + :version "27.1" + :type 'boolean) + (defvar diff-vc-backend nil "The VC backend that created the current Diff buffer, if any.") @@ -396,6 +401,7 @@ and the face `diff-added' for added lines.") (1 font-lock-comment-delimiter-face) (2 font-lock-comment-face)) ("^[^-=+*!<>#].*\n" (0 'diff-context)) + (,#'diff--font-lock-prettify) (,#'diff--font-lock-refined))) (defconst diff-font-lock-defaults @@ -2195,6 +2201,35 @@ fixed, visit it in a buffer." modified-buffers ", ")) (message "No trailing whitespace to delete."))))) + +;;; Prettifying from font-lock + +(defun diff--font-lock-prettify (limit) + ;; Mimicks the output of Magit's diff. + ;; FIXME: This has only been tested with Git's diff output. + (when diff-font-lock-prettify + (while (re-search-forward "^diff " limit t) + (when (save-excursion + (forward-line 0) + (looking-at (eval-when-compile + (concat "diff.*\n" + "\\(?:\\(?:new file\\|deleted\\).*\n\\)?" + "\\(?:index.*\n\\)?" + "--- \\(?:/dev/null\\|a/\\(.*\\)\\)\n" + "\\+\\+\\+ \\(?:/dev/null\\|b/\\(.*\\)\\)\n")))) + (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) + ;;; Support for converting a diff to diff3 markers via `wiggle'. ;; Wiggle can be found at http://neil.brown.name/wiggle/ or in your nearest -- 2.39.2